gpt4 book ai didi

php - 使用 __get 或类似方法访问 Array 类型的类成员变量

转载 作者:可可西里 更新时间:2023-11-01 01:06:52 24 4
gpt4 key购买 nike

以前我正在重建的一个类有一个成员变量 $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 会给我带来很多 fatal error ,我可以解决这个问题,但是有多个开发人员正在处理这个我不想破坏的代码库。如果我可以将此作为临时解决方案来实现,那将会有所帮助。

我知道有一些我们可以使用的存储库等,这样我就可以单独处理它并在之后 checkin ,但我正在寻找一个快速的临时解决方案,因为我们很快就会将我们的代码库移植到 Git。

最佳答案

完全可能:

<?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";

当然,它有点老套,您可能不想将它保留在您的代码库中,但对于记录已弃用的用途,它可能非常有用。只需登录一段时间,然后替换 $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

关于php - 使用 __get 或类似方法访问 Array 类型的类成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com