НООООО, иногда сложная логика скрывается именно в приватных методах и переменных, которые очень важны при тестирование, но скрыты от пользователя (тема для холивара).
Для этих редких целей о для того, что бы избежать использования Reflection во время самого тестирования я создал для себя контейнер, который позволяет пользоваться приватными методами и переменными объекта, для того, что бы увидеть результаты при тестирование этих приватных методов.
Пример применения.
namespace Test {
use Tools\PrivateToPublicContainer; // мой туль
// класс с приватными методами и мемберами для тестирования
class A {
private $ding = 5;
private $dong = null;
public function getDong(){return $this->dong;}
public function getDing(){return $this->ding;}
private function setPrivateDing($ding)
{
$this->ding = $ding;
}
private function getPrivateDing()
{
return $this->ding;
}
}
//ТЕСТ
$a = new A;
//передаём объект в контейнер и получаем через контейнер возможность пользоваться приватными методами и переменными объекта $а
/** @var A $container */
$container = new \Tools\PrivateToPublicContainer($a);
$container->dong = 10;
$container->ding = 20;
echo "\n". $a->getDing() . ' ' . $a->getDong() ."\n";
$container->setPrivateDing(50);
echo $container->getPrivateDing();
}
########
Ну а код который я состряпал в PrivateToPublicContainer:
namespace Tools{
use Exception;
class PrivateToPublicContainer
{
private $reflect;
private $object;
public function __construct($object)
{
if (!is_object($object)) {
throw new Exception('Containder is only for objects.');
}
$this->object = $object;
$this->reflect = new \ReflectionObject($object);
}
public function __get($name)
{
$property = $this->validateAndSetAcessible($name);
return $property->getValue($this->object);
}
public function __set($name, $value)
{
$property = $this->validateAndSetAcessible($name);
$property->setValue($this->object, $value);
}
public function __call($name, $arguments)
{
if (!$this->reflect->hasMethod($name)) {
throw new \UnexpectedValueException('method ' . $name . ' not exists');
}
$method = $this->reflect->getMethod($name);
$method->setAccessible(true);
return $method->invokeArgs($this->object, $arguments);
}
/**
* @param $name
* @return \ReflectionProperty
*/
private function validateAndSetAcessible($name)
{
if (!$this->reflect->hasProperty($name)) {
throw new \UnexpectedValueException('Property ' . $name . ' is not exists.');
}
$property = $this->reflect->getProperty($name);
$property->setAccessible(true);
return $property;
}
}
}
_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();