Я прочитал некоторые скрипты и я не могу понять, почему они ставят имя класса в конструкторе другого класса:Что означает имя класса в конструкторе другого класса?
public function __construct(AclassName $foo){
$this->foo=$foo;
}
Я прочитал некоторые скрипты и я не могу понять, почему они ставят имя класса в конструкторе другого класса:Что означает имя класса в конструкторе другого класса?
public function __construct(AclassName $foo){
$this->foo=$foo;
}
Поскольку они хотят, чтобы $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
Это создает ссылку на экземпляр класса, связанного с конструктором к экземпляру AclassName
, Предположительно, тогда экземпляр класса, связанного с конструктором, будет взаимодействовать с экземпляром AclassName
для выполнения одной или нескольких своих обязанностей.
Это называется тип намекая, и был добавлен в 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.
AclassName
- это тип-подсказка. Это означает, что первый аргумент, переданный конструктору, должен быть экземпляром AclassName
.
Wait .. какой? Ionut, вы только что отредактировали ответ Брэндона, вырезали его код и вставляете его в свой? ПЛОХОЙ ТОН. Отмечено -1. – hobodave
Я возвращаю свой предыдущий комментарий. Посмотрев на историю изменений, я понял, что Ionut отредактировал ответ ниже по ошибке и добавил к нему свои образцы кода. Затем он удалил эти изменения и добавил их к своему ответу здесь. Виноват. – hobodave
@hobodave, я думал, что отредактировал свой ответ, когда я впервые добавил код. После редактирования я заметил, что это был ответ Брэндона, поэтому я отбросил мое редактирование в ответ и добавил код к моему ответу. Я не такой парень, который, на мой взгляд, является невозможным. –