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);
     }
} 
  
   
  
   
             
            