2016-03-11 3 views
-2

Рассмотрим статический класс (частный конструктор, только статические методы & переменных).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 ...

Другое возможное решение:

Если вы не хотите создать целый синглтон, это может быть решение - создание частичного singleton - какой-то singleton-hepler, altough с использованием ->, чтобы вызвать статический метод, может быть запутанным!

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

Что бы 'B :: A :: тест()' 'делать, что A :: тест()' не ...?! – deceze

+2

Я до сих пор не понимаю, какая разница. Скажем так: синтаксис, который вы показываете, не существует и, следовательно, не имеет внутреннего смысла. Вы пытаетесь придумать здесь какой-то новый вид операции или приступить к какой-либо существующей операции с плохим объяснением. Пожалуйста, объясните более подробно, что должно было произойти, и почему просто 'A :: test()' не сокращает его. – deceze

+0

Почему вы хотите вызвать статический класс через другой статический класс? разве это не злоупотребление целью статического класса? Чтобы упростить создание экземпляра в других классах (сделать его абстрактным для удобства использования). – izk

ответ

1

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

class B { 
    const A = 'A'; 
} 

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

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

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

+0

'A' можно назвать самим, но если его имя будет короче, это может привести к конфликту - но не при вызове его через« B »- таким образом понятно, что' A' следует вызывать ... –

+0

Приколите себя ... :) – deceze

+0

На микроуровне, возможно, так, но я пытаюсь сказать вам, что, возможно, на макроуровне вы должны переосмыслить вещи ... Но опять же, подойдите сами ... :) – deceze

0

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

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

Это сработало бы, но также добавило бы слишком много не необходимого синтаксиса ... спасибо в любом случае:) –

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