$test = new Test();
$test->config = 'config';
// Как то делаем свойство config приватным
echo $test->config; // Ошибка
P.S. При этом, свойство config явно не указано в классе Test.
Вот класс где это используется:
// Ядро
// $_instance - экземпляр класса
// $_vars - массив переменных
class Core
{
private static $_instance = null;
private $_vars = array();
private $_config = array();
// Создание экземпляра класса
public static function instance()
{
if (self::$_instance == null)
self::$_instance = new self();
return self::$_instance;
}
// Функция автозагрузки
// $file - файл
public static function autoload($file)
{
if (isset($this->_config['core']['dirs']))
{
foreach ($this->_config['core']['dirs'] as $dir)
{
if (is_readable($dir . $file . '.php'))
{
include_once $dir . $file . '.php';
break;
}
}
}
}
// Получение переменной
// $var - имя переменной
public function __get($var)
{
if (isset($this->_vars[$var]))
return $this->_vars[$var];
}
// Присваивание значения
// $var - имя переменной
// $val - значение
public function __set($var, $val)
{
if (!isset($this->_vars[$var]))
{
if (is_object($val))
{
$val->__core = self::instance();
$val->__config = $this->_config[$var];
}
$this->_vars[$var] = $val;
}
}
public function config($array)
{
$this->_config = $array;
}
// Запрещяем вызывать эти методы
private function __construct() {}
private function __clone() {}
}
// Регистрируем функцию автозагрузки
spl_autoload_register(array('Core', 'autoload'));
class Test {}
$config['test']['123'] = 'zzz';
Core::instance()->config($config);
Core::instance()->test = new Test();
Core::instance()->test->__config['123'] = 'xxx'; // Должна быть ошибка (нельзя переопределять свойство)
print_r(Core::instance()->test);