Эта тема на forum.dklab.ru


Doof: ограничение созданя экземпляров класа
Есть следующая потребность:

могу ли я на PHP сделать так, чтобы экземпляр некого класса можно было создать только внутри экземпляра класса kernel и нельзя было создать в globals или внутри экземпляров любого другого класса кроме kernel. ?

спасибо
Миша Спларов:
Doof, читайте в мануале о private и protected (php5 only)
Raumkraft:
есть 2 класса class1 и class2
каким образм свойства protected и private помогут мне в том, что я хочу чтобы работало:
<?
class class1 {
public function __construct() {
$c = new class2();
}

}

new class1();

?>

и не работало

<?
$c=new class2();
?>

?
Ksnk:
IMHO такое в самом языке отсутствует, но можно завести глобальный флажок, который в конструкторе class1 поднимать-создавать-опускать, а в конструкторе class2 проверять.
Raumkraft:
Сейчас так и делается, но неудобно это :(
Дмитрий Котеров:
То, что Вы хотите, называется friend-классами. В C++ они поддерживаются, в PHP - нет. Так что единственное, что Вам остается, это использовать http://php.net/debug_backtrace и проверять, из метода какого класса вызван конструктор.
SNiP:
а если что-то вроде:
class MyClass
{
private function __construct()
{
//
}
public static function getInstance(Kernel $obj) // как вариант вторым аргументом, можно передавать имя поля.
{
$obj->class = new MyClass();
}
}
$core = new Kernel;
MyClass::getInstance($core);

честно не пробовал.

Эта тема на forum.dklab.ru