Я уже знаю, как создать __construct()
Метод в классе, который выполняется первым до выполнения указанной вами функции, когда вы создаете экземпляр этого класса. Мой класс статичен со многими методами — все статично.
Я хотел бы создать метод, который всегда выполняется при вызове статического метода. Цель этого состоит в том, что я хотел бы создать одноэлементный класс путем жесткого внедрения экземпляра другого класса в статическое свойство и использования статического свойства для доступа ко всем его методам.
<?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()
всегда выполняться первым всякий раз, когда любой метод операций с массивами вызывается в любом порядке? — без необходимости сначала вызывать этот метод внутри каждого из статических методов? И без использования целого пользователя будет использовать этот класс, создавая экземпляр вручную, прежде чем получить доступ к этой функции?
Я хотел бы, чтобы использование этого класса было полностью статичным с точки зрения пользователя.
Рассматривали ли вы использование завод шаблон дизайна? Таким образом, вы можете добиться того, что вы вызываете статический метод, который создает экземпляр объекта, и вы можете избежать использования такой странной структуры, как эта: 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);
Надеюсь это поможет.
Других решений пока нет …