Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
однако, один вопрос в статье упущен (или мне показалось?)
echo (echo "string");
echo (print "string");
И кстати, всё написанное выше относится только к свойствам. Использование статического свойства через "->" невозможно и ведет к фатальной ошибке.
Когда подрос понял что это глупо
Если же статья не про нюансы, а про другое, тогда мой первый вопрос на счёт заголовка до сих пор в силе.
Это здорово, но позвольте, вы так и не ответили тогда на вопрос «почему для собеседования?»
<?php
class firstClass
{
/** @var string */
protected $message;
public function __construct($message)
{
$this->message = $message;
}
}
class secondClass extends firstClass
{
/** @var firstClass */
protected $firstClass;
public function __construct(firstClass $firstClass)
{
$this->firstClass = $firstClass;
}
public function accessProtected()
{
return $this->firstClass->message;
}
}
$a = new firstClass('Hello protected');
$b = new secondClass($a);
var_dump($b->accessProtected());
class a {
protected function test()
{
return 'protected';
}
}
class e extends a {
}
class c extends a {
public function __call($name, $args)
{
return call_user_func_array(array(array_shift($args), $name), $args);
}
}
$e = new e();
$c = new c();
echo $c->test($e);
А реально неожиданное — это только «позднее связывание» с заменой $self на static.
static и ведет себя так, как должен вести себя в классических ОО-языках, для меня было большей неожиданностью поведение self когда я узнал о позднем связывании. потому следует понимать когда нужно использовать self, а когда static. как по мне, то использование static более прозрачно, а вот self использовать уже когда это дейсвительно нужно оправданоfunction foo() {
static $a = 0;
echo $a;
$a = $a + 1;
}
foo(); // 0
foo(); // 1
foo(); // 2
На самом деле есть ещё одно несказанное использование static, доступное по умолчанию с PHP 5.4:
class A
{
private $item;
public function foo()
{
// здесь колбэк по умолчанию замыкается на this контекста,
// с которого он был вызван (по умолчанию с PHP 5.4)
$callable = function () {
return $this->item * 2;
}
}
public function bar()
{
// однако если указать static, то замыкаться на this вызванного контекста
// колбэк уже не будет
$callable = static function () {
return $this->item * 2; // кинет fatal error
}
}
}
Готовимся к собеседованию по PHP: ключевое слово «static»