Как создать конструктор для статического метода в классе PHP

Я уже знаю, как создать __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() всегда выполняться первым всякий раз, когда любой метод операций с массивами вызывается в любом порядке? — без необходимости сначала вызывать этот метод внутри каждого из статических методов? И без использования целого пользователя будет использовать этот класс, создавая экземпляр вручную, прежде чем получить доступ к этой функции?

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

1

Решение

Рассматривали ли вы использование завод шаблон дизайна? Таким образом, вы можете добиться того, что вы вызываете статический метод, который создает экземпляр объекта, и вы можете избежать использования такой странной структуры, как эта: 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);

Надеюсь это поможет.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]