Visibilidade de membros de classe privada PHP

A manipulação de campos / membros “privados” de uma classe pelo PHP pode surpreendê-lo. Normalmente, um campo privado só é acessível pelos métodos da própria classe. Na verdade, mesmo as classes que estendem outra podem não acessar os membros privados da classe pai.

No entanto, se você passar uma instância externa separada de uma classe para outra do mesmo tipo, ficará surpreso ao descobrir que a classe pode realmente acessar os membros privados da classe injetada.

Código fala mais claro do que palavras:

Código

<?php

class Doge
{

private $name;

public function __construct($name)
{
$this
->name = $name;
}

public function getName()
{
return $this->name;
}

public function equalsWithSameType(self $other)
{
return ($other->name === $this->name);
}

public function equalsWithSubType(DogeCoin $sub)
{
return ($sub->name === $this->name);
}

public function equalsWithRandomType(SomethingElseCompletely $whatever_man)
{
return ($whatever_man->name === $this->name);
}
}

class DogeCoin extends Doge
{
private $name;
}

class SomethingElseCompletely
{
private $name;

public function __construct($name) {
$this
->name = $name;
}
}

$first_doge
= new Doge('a');
$second_doge
= new Doge('a');
$doge_coin
= new DogeCoin('a');
$something_else_completely
= new SomethingElseCompletely('a');

var_dump
($first_doge->equalsWithSameType($second_doge));
var_dump
($first_doge->equalsWithSubType($doge_coin));
var_dump
($first_doge->equalsWithRandomType($something_else_completely));

Resultado

bool(true)
bool
(true)

Fatal error: Cannot access private property SomethingElseCompletely::$name in /in/dsdtr on line 30

Process exited with code 255.

Ah, e aqui está em várias versões, se você estiver curioso: http://3v4l.org/dsdtr

Parece estranho, hein? Embora documentado, ainda parece um comportamento estranho.

Cenário

(Fonte http://www.php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-other-objects )