abstract class SomeAbstract
{
protected $var = 'variable data';
}
class InheritedСlass extends SomeAbstract
{
public function someAction(SomeAbstract $someAbstract)
{
dump($someAbstract->var); // вот здесь не понятно, как protected var превратилась в public
}
}
class SomeClass
{
public $var = 'Hello, world!';
}
class TestClass
{
public function action(SomeClass $someClass)
{
return $someClass->var;
}
}
public function index(TestClass $testClass)
{
dd( $testClass->action(new SomeClass()) ); // выводит - 'Hello, world!'
}
class SomeClass
{
protected $var = 'Hello, world!';
}
public function index(TestClass $testClass)
{
dd( $testClass->action(new SomeClass()) ); // получаем ошибку - Cannot access protected property
}
class TestClass extends SomeClass
{
public function action(SomeClass $someClass)
{
return $someClass->var;
}
}
public function index(TestClass $testClass)
{
dd( $testClass->action(new SomeClass()) ); // выводит - 'Hello, world!'
}
abstract class SomeAbstract
{
public $var = 'variable data';
}
class InheritedСlass
{
public function someAction(SomeAbstract $someAbstract)
{
dump($someAbstract->var); // всё работает
}
}
После в абстрактном классе верните переменной protected - получите ошибку. Но если добавить наследование(class InheritedСlass extends SomeAbstract) - ошибка пропадает.
Объектам одного и того же типа доступны защищённые и закрытые члены класса друг друга, даже если это разные экземпляры. Это связано с тем, что внутри таких объектов уже известны конкретные детали реализации.
abstract class SomeAbstract
{
private $var = 'variable data';
public function someAction(SomeAbstract $someAbstract)
{
dump($someAbstract->var);
}
}