以前我正在重建的一个类有一个成员变量$settings
这是一个设置数组,奇怪的是。
class MyClass {
public $settings = array();
public function __construct() {
if( empty( $this->settings ) ) {
$this->settings = require( 'settings.php' ); // e.g. return array('setting1'=>4);
}
}
}
$object->settings['keyname'];
现在,访问这些键的方法已移至方法中。但是,应用程序本身充斥着对$object->settings['keyname']
的调用。我想知道是否有一种方法可以捕获对$settings
成员变量的任何调用并使用新函数返回它。
我已查看__get($name)
,但$name
仅包含settings
,而不是我需要的数组键。我需要传递的内容是我的$object->get()
方法的关键名称。
我想这样做的原因是我可以在日志文件中触发错误,向我显示$object->settings[]
已弃用的调用的位置,而不会破坏应用程序。显然将$ setting设置为private会给我带来许多致命的错误,我可以解决这个问题,但是有多个开发人员正在研究这个代码库,我不想打破它。如果我可以将其作为临时解决方案来实现,那么它就会有所帮助。
我意识到我们可以使用存储库等,以便我可以单独处理它并在之后检查它但是我正在寻找一个快速,临时的解决方案,因为我们将代码库移植到Git soonish。
答案 0 :(得分:3)
完全可能:
<?php
class Logger {
public function log( $name, $backtrace ) {
/**
* $name is the name of the array index that was called on
* MyClass->settings( ). $backtrace contains an array in which
* you can find and determine which file has accessed that index,
* and on which line.
*/
$last = array_shift( $backtrace );
$message = sprintf( "Setting '%s' was called by file '%s' on line %d",
$name,
$last['file'],
$last['line']
);
echo $message;
}
}
class MyClass {
protected $settings;
public function __construct( ) {
$this->settings = new Settings( new Logger( ), array( 'foo' => 'bar' ) );
}
public function __get( $name ) {
if( $name === 'settings' ) {
return $this->settings;
}
}
}
class Settings extends ArrayObject {
protected $logger;
protected $settings;
public function __construct( Logger $logger, array $settings ) {
$this->logger = $logger;
parent::__construct( $settings );
}
public function offsetGet( $name ) {
$backtrace = debug_backtrace( );
$this->logger->log( $name, $backtrace );
return parent::offsetGet( $name );
}
}
$myClass = new MyClass( );
echo $myClass->settings['foo'] . "\n";
当然,它是hackish,你可能不希望将它保留在你的代码库中,但是对于记录已弃用的用途,它可能非常有用。只需记录一段时间,然后将$this->settings = new Settings( )
替换为$this->settings = array( )
。
顺便说一句,该确切代码的输出如下:
berry@berry-pc:~/Desktop% php foo.php
Setting 'foo' was called by file '/home/berry/Desktop/foo.php' on line 53
bar
答案 1 :(得分:1)
查找脚本在设置中设置变量的位置:
我建议在你的MyClass
类的构造函数和析构函数中添加一个小的hack。在构造函数中扫描$settings
并检查是否存在已弃用的值(将其保存在某个临时值)。在析构函数中执行相同的检查,并交叉匹配两个结果。如果在销毁过程中有新变量,则表示$_SERVER['PHP_SELF']
已设置它。
要查找脚本访问它的位置:
野蛮,但我建议只将所有弃用的值转换为新值,并观察事情停止工作。您将花费更少的时间来追踪已发生的事情,并阅读“这曾经工作但没有”投诉,而不是修改课程以使用记录器