PHP: возможно ли вызвать метод статического класса из другого статического класса?

Рассмотрим статический класс (приватный конструктор, только статические методы & переменные).

Теперь приблизительное определение класса будет выглядеть так:

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");

-2

Решение

Вы должны будете использовать этот синтаксис:

class B {
const A = 'A';
}

$class = B::A;
$class::test()

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

Обратите внимание, что я не думаю, что такой шаблон имеет большой смысл, ваш дизайн класса слишком статично с этой точки зрения. Вы должны создавать свои классы и вызывать $b->a->test(), что дает вам больше гибкости в дизайне вашего приложения. реалистично B::A является жёстко, это не будет ничего, кроме 'A'так что вы можете также написать A::test() непосредственно.
Если вместо const вы бы использовали public static свойство, которое может меняются во время выполнения, вы сейчас вводите глобальное состояние в ваше приложение, что также нежелательно.

1

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

вызов статической функции класса из статической функции другого класса

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'
0

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