을 만드는 것입니다 :
<?php
class FooFactory
{
private static $foo;
private function __construct()
{
}
public static function getInstance()
{
return self::$foo ? self::$foo : (self::$foo = new FooFactory());
}
public static function destroyInstance()
{
self::$foo = null;
}
public function __call($fn, $args)
{
if (!method_exists(self::$foo, $fn) || $fn[0] == "_")
throw new BadMethodCallException("not callable");
call_user_func_array(array(self::$foo, $fn), $args);
}
# function hidden since it starts with an underscore
private function _listen()
{
}
# private function turned public by __call
private function speak($who, $what)
{
echo "$who said, '$what'\n";
}
}
$foo = FooFactory::getInstance();
$foo->speak("cat", "meow");
$foo->_listen(); # won't work, private function
FooFactory::destroyInstance();
$foo->speak("cow", "moo"); # won't work, instance destroyed
?>
은 분명히 해킹입니다.
나는 이것이 어떻게 작동하는지 이해하려고 고심하고있다. 제발 날 정교하게 만들어 주시겠습니까? –
메소드를 비공개로 표시함으로써 마술적인'__call' 메소드를 트리거합니다. 이 함수는'private static $ instance'가 파기되지 않았 으면 호출을 private 함수로 전달합니다. 모든 공용 함수의 맨 위에'if (! self :: $ instance) throw new Exception();을 추가하는 것과 같은 일종입니다. – Matthew