Рассмотрим статический класс (приватный конструктор, только статические методы & переменные).
Теперь приблизительное определение класса будет выглядеть так:
class A{
private function __construct(){}
public static test(){};
}
class B{
private function __construct(){}
}
Можно ли как-то назвать что-то вроде B::A::test()
?
Или может через переменную? Что-то вроде B::$A::test()
?
Я предполагаю, что это возможно с помощью общего вызова, но я не могу понять …
ВАЖНЫЙ: Кроме того, я хочу вызвать любой другой статический класс из B
не только из A
учебный класс…
EDIT2: Чего я хочу добиться, так это вызывать статический класс через другой статический класс, если это возможно … очень похоже на вызов метода из объектной переменной — но статический класс (очевидно) не предназначен для создания экземпляра.
EDIT3: Также возможное решение состоит в том, чтобы назвать это как B::CLASSNAME_METHOD_NAME
и поймать его __callStatic
но я бы предпочел сделать B::CLASSNAME::METHOD_NAME
…
Другое возможное решение:
Если вы не хотите создавать целый синглтон, это может быть решение — создание частичного синглтона — своего рода синглтон-геплер, хотя и с использованием ->
Вызов статического метода может сбить с толку!
class AA{
private function __construct(){}
private static $instance;
public function getInstance(){ return empty(self::$instance)?(new self()):self::$instance; }
public function __call($method_name, $args) {
return AA::$method_name($args);
}
public static function test($a, $b){
echo "TEST: A:".$a." B:".$b;
}
}
class B{
private function __construct(){}
public static function A(){
return AA::getInstance();
}
}
B::A()->test("one", "two");
Вы должны будете использовать этот синтаксис:
class B {
const A = 'A';
}
$class = B::A;
$class::test()
По сути, это всего лишь синтаксис вызова статического метода для имени класса переменной. Там нет более приятного ярлыка для этого.
Обратите внимание, что я не думаю, что такой шаблон имеет большой смысл, ваш дизайн класса слишком статично с этой точки зрения. Вы должны создавать свои классы и вызывать $b->a->test()
, что дает вам больше гибкости в дизайне вашего приложения. реалистично B::A
является жёстко, это не будет ничего, кроме 'A'
так что вы можете также написать A::test()
непосредственно.
Если вместо const
вы бы использовали public static
свойство, которое может меняются во время выполнения, вы сейчас вводите глобальное состояние в ваше приложение, что также нежелательно.
вызов статической функции класса из статической функции другого класса
class A{
private function __construct(){}
public static function test()
{
echo 'from class A';
}
}
class B{
private function __construct(){}
public static function test()
{
return A::test();
}
}
A::test(); //outputs 'from class A'
B::test(); //outputs 'from class A'