2009-07-26 4 views

ответ

8

Поскольку они хотят, чтобы $foo являлся экземпляром только AclassName. Не массив, число, строка или экземпляр класса, который не является AclassName, ни extends AclassName. В PHP называется type hinting, хотя они на самом деле не намеки, а принудительные меры.

function foo (array $bar) { 
    // $bar must be an array, otherwise an E_RECOVERABLE_ERROR is thrown 
} 

function baz (ClassName $bar) { 
    // $bar must be an instance of ClassName 
} 

baz(new ClassName); // works OK 
baz(new StdClass); // error 

class ExtendsFromClassName extends ClassName 
{} 

baz(new ExtendsFromClassName); // works OK 

намекая может быть сделано на интерфейсы или абстрактные классы тоже:

interface SomeInterface 
{} 

function baz(SomeInterface $object) { 
    // $object must be an instance of a class which implements SomeInterface 
} 

class Foo implements SomeInterface 
{} 

baz(new Foo); // works OK 
+0

Wait .. какой? Ionut, вы только что отредактировали ответ Брэндона, вырезали его код и вставляете его в свой? ПЛОХОЙ ТОН. Отмечено -1. – hobodave

+0

Я возвращаю свой предыдущий комментарий. Посмотрев на историю изменений, я понял, что Ionut отредактировал ответ ниже по ошибке и добавил к нему свои образцы кода. Затем он удалил эти изменения и добавил их к своему ответу здесь. Виноват. – hobodave

+0

@hobodave, я думал, что отредактировал свой ответ, когда я впервые добавил код. После редактирования я заметил, что это был ответ Брэндона, поэтому я отбросил мое редактирование в ответ и добавил код к моему ответу. Я не такой парень, который, на мой взгляд, является невозможным. –

2

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

1

Это называется тип намекая, и был добавлен в PHP5. В принципе, это означает, что поставляемое значение для этого аргумента метода/функции должно быть быть экземпляром этого имени класса. Если это не так, PHP-движок вызовет угасающую фатальную ошибку.

Вот простой пример, основанный на фрагменте кода вы предоставили:

class AnotherClass 
{ 
    /** 
    * @var SomeClass 
    */ 
    protected $_someClass; 

    public function __construct(SomeClass $some) { 
     $this->_someClass = $some; 
    } 
} 


$someClass = new SomeClass(); 
$differentClass = new DifferentClass(); 

// Fatal Error: Argument 1 must be an instance of SomeClass 
$anotherClass = new AnotherClass($differentClass); 
$anotherClass = new AnotherClass('a string'); 


// That's ok! 
$anotherClass = new AnotherClass($someClass); 

Тип намекая, как оператор instanceof принимает наследование классов и реализацию интерфейса во внимание.

Вы можете найти relevant PHP manual page here.

0

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

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