2016-05-12 2 views
0

У меня есть класс с именем Foo с конструктором, и я хочу, чтобы одна его переменная являлась именем дочернего класса.Auto init статического класса, который расширяет родительский

Пример:

class Foo { 

    protected static $name; 
    protected static $something; 

    public function __construct($something) { 
     self::$something = $something; 
     self::$name = strtolower(__CLASS__); 
    } 

    static public function hello() { 
     echo self::$name; 
    } 

} 

class Bar extends Foo {} 

new Foo('lazy'); 
Bar::hello(); 

Результат будет всегда foo(), потому что конструктор вызывается только new Foo().

Итак, каков путь? Есть ли волшебный метод, вызываемый при вызове статического метода? Извините за плохое объяснение.

+0

https://eval.in/569930 – splash58

+0

Спасибо, но это не решит. Мне нужно сохранить его в переменной без вызова каждый раз, когда функция. Здравствуйте, нужно быть просто зрителем переменной, а не гипнотическим сеттером. – Grork

+0

* Мне нужно сохранить его в переменной * - когда это произойдет, если вы не захотите вызвать конструкцию? – splash58

ответ

0

get_called_class() следует использовать вместо __CLASS__ магическая константа.

http://php.net/manual/en/function.get-called-class.php

Более подробная информация в руководстве: late static binding

+0

Всегда в конструкции? Я не хочу выполнять другую функцию для каждого класса, чтобы установить переменную $ name. – Grork

0

Как сказал @JesusTheHun, в первую очередь вы хотите изменить __CLASS__ либо get_called_class() или static::class (по состоянию на PHP 5.5). Строка __CLASS__ считывается во время компиляции и всегда будет ссылаться на класс, в котором она указана. Любой из других вариантов вступает в силу во время выполнения.

Однако, установив в конструкторе статическую переменную класса, вы меняете эту переменную для всех экземпляров класса (прошлого и настоящего), а также изменяя его для любых статических вызовов. Таким образом, всякий раз, когда экземпляр любого класса в дереве конкретизируется, все последующие вызовы на привет() покажут, что имя класса, т.е.

<?php 
class Foo { 
    protected static $name; 
    protected static $something; 

    public function __construct() { 
     self::$name = strtolower(static::class); 
    } 

    static public function hello() { 
     echo self::$name; 
    } 
} 

class Bar extends Foo {} 
class Baz extends Foo {} 

new Foo; 
Bar::hello(); // "foo" 
new Baz; 
Bar::hello(); // "baz" 

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

static public function hello() { 
     echo static::class; 
    } 
+0

Mh, да, я думал, что это душа, но мне не нужно каждый раз запускать класс (так что избегайте нового Baz). Я думаю, что нет автоматического способа. – Grork

+0

@Grork Я не уверен, что тогда понимаю. Если вы хотите, чтобы статический метод эхо отзывал соответствующее имя класса, используйте метод hello() в конце моего ответа. Если вы хотите, чтобы он возвращал что-то еще, то это звучит так, как будто вы ищете не статический метод. – iainn

+0

Ну. Ты прав. Думаю, я воспользуюсь этим. Благодаря! – Grork

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