2015-04-10 2 views
-1

Я использую редактор NetBeans. В следующем коде нет ошибки, но я чем-то смущен: почему мы return new static?Какие новые способы создания новых объектов?

class test { 
    static public function getnew(){ 
      return new static; 
    } 
} 
class child extends test {} 

$obj1 = new test(); 
$obj2 = new $obj1; 
var_dump($obj1!==$obj2); 
$obj3 = test::getnew(); 
var_dump($obj3 instanceof test); 
$obj4 = child::getnew(); 
var_dump($obj4 instanceof child); 

Полученный выход:

boolean true 
boolean true 
boolean true 

Так что же return new static здесь делает?

ответ

0
return new static; 

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

1

Это часть Late Static Bindings, представленная в PHP 5.3.

По существу, ключевое слово static будет заменено текущим классом во время выполнения. Так что в случае child она будет определена как:

static public function getnew(){ 
    return new child; 
} 

Проблемы с использованием __CLASS__ или self является то, что они будут заменены на компиляции времени. Поэтому, если вы должны были делать new self;, они всегда возвращали экземпляр класса test (где определена функция getnew()), даже если метод вызывается в дочернем классе. Ключевое слово static предназначено для предотвращения именно этого.

Основная причина, по которой вы хотите использовать это, - это то, что вам не нужно переопределять getnew в каждом дочернем классе.

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