2016-01-03 3 views
1

Я уже знаю, как создать метод __construct() в классе, который выполняется до того, как будет выполнена указанная вами функция, когда вы создадите экземпляр этого класса. Мой класс статичен со многими методами - все статическими.Как создать contructor для статического метода в классе PHP

То, что я хотел бы достичь, - создать метод, который всегда выполняется при вызове статического метода. Целью этого является то, что я хотел бы создать одноэлементный класс путем принудительного ввода экземпляра другого класса в статическое свойство и использования статического свойства для доступа ко всем его методам.

<?php 
class ArrayObject { 

    private $input_array; 

    private $output_array; 

    //this method removes elements with null values 
    public function clean(array $array) 
    { 
    #...code to remove empty value elements 

    //set the value of the output to the output array 
    $this->output_array = $result; 
    } 

    //this method strips whitespace from array element 
    public function trim(array $array) 
    { 
    #...code to remove whitespace 

    //set the value of the output to the output array 
    $this->output_array = $result; 
    } 

    //this method returns the value of the $output_array 
    public function getOutput() 
    { 
    return $this->output_array; 
    } 

} 

Выше класса объектов, которые должны быть введены в статический класс в качестве зависимости. Ниже статический класс для реализации этого ArrayObject

<?php 
class ArrayClass { 

    private static $arrayObject; 

    //this method sets the value of the $arrayObject 
    private static function setArrayObject() 
    { 
    self::$arrayObject = new ArrayObject(); 

    } 

    //this method removes elements with null values 
    public static function clean(array $array = null) 
    { 
    #...call method to remove empty value elements 

    self::$arrayObject->clean($array); 

    return new static; 
    } 

    //this method strips whitespace from array elements 
    public static function trim(array $array = null) 
    { 
    #...call method to remove whitespace 
    self::$arrayObject->trim($array); 

    return new static; 
    } 

    //this method returns the value of the $output_array 
    public static function get() 
    { 
    return self::$arayObject->getOutput(); 
    } 

} 

причина, почему я делаю это так, что я в состоянии методов цепи в этой манере ArrayClass::clean($array)->trim()->get();.

Вы можете сказать, но почему бы не сделать все это в статическом классе вместо создания отдельного объекта для этого - причина, по которой мне нужно создать два класса, - это то, что я хотел бы, чтобы один класс обрабатывал операции массива и другой - для получения параметров массива в цепочке, чтобы я четко отделял логику.

Посмотрите, что для каждого метода требуется допустимый массив. То, что я хотел бы сделать со статическим классом, - проверить нулевое значение, переданное в цепочном вызове. Если вызов метода пуст, статический класс примет выходной массив из предыдущего вызова и отправит его как input_array ко второму прикованному вызову, так что, когда вы хотите выполнять операции с цепочкой, вы передаете этот параметр только первому вызову метода.

Теперь, надеясь, что вы все это поняли, мой вопрос: как я могу установить public static function setArrayObject(), чтобы всегда выполняться при каждом вызове любого метода операций массива в любом порядке? - без необходимости сначала вызвать этот метод внутри каждого из статических методов? И без пользователя весь будет использовать этот класс, чтобы сначала создать экземпляр вручную, прежде чем обращаться к этой функции?

Я хотел бы, чтобы этот класс был полностью статичным с точки зрения пользователя.

+0

Что вы ожидаете, будет возвращено 'return new static;'? –

+0

'return new static' возвращает' instance' статического класса, чтобы включить статическое связывание методов. Но не то же самое, что и экземпляр, когда мы используем ключевое слово 'new'. Это эквивалент 'return $ this' в объекте – geoffreybans

+0

Нет термина' статический класс'. Существует «статический метод», который вызывается без экземпляра класса. –

ответ

1

Рассматривали ли вы использование модели Factory? К этому можно добиться того, что вы называете статический метод, который создает экземпляр объекта, и вы можете не использовать такие странные структуры, как это: ArrayClass::clean($array)->trim()->get();

Пример:

<?php 

class Array { 

    // you can implement all your methods here 

    public function getOutput() { 
    } 

    // ... 

} 

class ArrayFactory { 

    public static function create($params) { 
     // you can call all necessary cleaning methods here 
     // before creating new object 

     return new Array($params); 
    } 

} 

// usage: 

/** @var Array **/ 
$array = ArrayFactory::create($params); 

Надеется, что это помогает.

+0

Я ценю ваши усилия. Я не хотел бы сразу внедрять все методы, потому что пользователю не всегда нужно будет сразу вызвать все методы. Это вспомогательный класс Array, который я разработал. Вам может потребоваться удалить пустой элемент, вызвав 'ArrayClass :: clean ($ array) -> get()', или вам может потребоваться удалить только пробелы из строковых значений как 'ArrayClass :: trim ($ array) -> get () 'или вам может потребоваться сделать это как« ArrayClass-> clean ($ array) -> trim() -> get() 'Все это легко достигается индивидуальной функциональностью, но мы хотели бы создать цепочечный вызов метода для всех методов для подражания ООП. – geoffreybans

+1

Спасибо за разъяснение, теперь я вижу точку. Однако, насколько мне кажется, я все еще не могу найти решение вашей проблемы. Почему вы хотите создавать цепные вызовы методов и почему вы думаете, что он будет эмулировать ООП? Если вы просто хотите создать вспомогательный класс, который работает с массивом, не стесняйтесь использовать только статические методы, которые не возвращают какой-либо объект, просто массив. Как бы вы переименовали свои классы, чтобы не использовать слова 'Object' и' Class'? – honzalilak

+0

ArrayObject - это класс библиотеки SPL для управления массивами или объектами. Много раз в вашем приложении вы можете выполнять различные операции с массивами в одном массиве, чтобы вы обнаружили, что вы вставляете вызовы функций - эта часть не крутая. Класс ArrayObject реализует «реализует IteratorAggregate, ArrayAccess, Serializable, Countable {}» и сам по себе не позволяет цепочку методов и не имеет всех методов, которые вам нужно выполнить в вашем массиве. Поэтому вы можете расширить его и добавить методы. Статические методы внедряются, чтобы помочь мне вызвать вызовы методов метода. – geoffreybans

Смежные вопросы