我写了一个相当简单的延迟加载代理类,这是我在过去超过在http://blog.simonholywell.com/post/2072272471/logging-global-php-objects-lazy-loading-proxy通过引用传递__call()参数失败。任何工作?
记录现在,当我转换的另一个项目,它的工作我已经被进行代理的方法,它有一个绊倒的参数通过引用传递给它。当这个经过我的代理类的__call方法获得:
Fatal error: Method LazyLoader::__call() cannot take arguments by reference in /home/simon/file/name.php
这如何可能得到解决或周围工作的任何巧妙的构思。如果可能,最好不要重构需要通过引用的代码。
延迟加载代理类看起来是这样,但在my blog post的描述能够更好地解释了目的:
<?php
/**
* @author Simon Holywell <[email protected]>
*/
class LazyLoadingProxy {
/**
* Where the instance of the actual class is stored.
* @var $instance object
*/
private $instance = null;
/**
* The name of the class to load
* @var $class_name string
*/
private $class_name = null;
/**
* The path to the class to load
* @var $class_path string
*/
private $class_path = null;
/**
* Set the name of the class this LazyLoader should proxy
* at the time of instantiation
* @param $class_name string
*/
public function __construct($class_name, $class_path = null) {
$this->setClassName($class_name);
$this->setClassPath($class_path);
}
public function setClassName($class_name) {
if(null !== $class_name) {
$this->class_name = $class_name;
}
}
public function getClassName() {
return $this->class_name;
}
public function setClassPath($class_path) {
if(null !== $class_path) {
$this->class_path = $class_path;
}
}
public function getClassPath() {
return $this->class_path;
}
/**
* Get the instance of the class this LazyLoader is proxying.
* If the instance does not already exist then it is initialised.
* @return object An instance of the class this LazyLoader is proxying
*/
public function getInstance() {
if(null === $this->instance) {
$this->instance = $this->initInstance();
}
return $this->instance;
}
/**
* Load an instance of the class that is being proxied.
* @return object An instance of the class this LazyLoader is proxying
*/
private function initInstance() {
Logger::log('Loaded: ' . $class_name);
require_once($this->class_path);
$class_name = $this->class_name;
return new $class_name();
}
/**
* Magic Method to call functions on the class that is being proxied.
* @return mixed Whatever the requested method would normally return
*/
public function __call($name, &$arguments) {
$instance = $this->getInstance();
Logger::log('Called: ' . $this->class_name . '->' . $name . '(' . print_r($arguments, true) . ');');
return call_user_func_array(
array($instance, $name),
$arguments
);
}
/**
* These are the standard PHP Magic Methods to access
* the class properties of the class that is being proxied.
*/
public function __get($name) {
Logger::log('Getting property: ' . $this->class_name . '->' . $name);
return $this->getInstance()->$name;
}
public function __set($name, $value) {
Logger::log('Setting property: ' . $this->class_name . '->' . $name);
$this->getInstance()->$name = $value;
}
public function __isset($name) {
Logger::log('Checking isset for property: ' . $this->class_name . '->' . $name);
return isset($this->getInstance()->$name);
}
public function __unset($name) {
Logger::log('Unsetting property: ' . $this->class_name . '->' . $name);
unset($this->getInstance()->$name);
}
}
任何帮助极大的赞赏。
我不认为它是可能的。 – 2011-02-18 16:10:01
是的,我认为你可能是对的。仍然希望有人可能有魔法修复,但! :) – Treffynnon 2011-02-18 16:11:39