Php 将数组转换为对象以自动执行数组\u键\u exists()
我需要我的代码不抛出任何通知,因此我编写了一个小类来访问数组,而不必一直担心未定义的索引Php 将数组转换为对象以自动执行数组\u键\u exists(),php,arrays,oop,Php,Arrays,Oop,我需要我的代码不抛出任何通知,因此我编写了一个小类来访问数组,而不必一直担心未定义的索引 class ArrayAsObject { private $array; public function __construct(&$array) { $this->array = &$array; } public function __get($key) { if (array_key_exists($key, $this->arra
class ArrayAsObject
{
private $array;
public function __construct(&$array) {
$this->array = &$array;
}
public function __get($key)
{
if (array_key_exists($key, $this->array)) {
return $this->array[$key];
} else {
return null;
}
}
}
$fruits = array ('apples' => 42);
$fruits = new ArrayAsObject($fruits);
echo $fruits->apples; // 42
echo $fruits->lemons; // null
我只是想知道这是否会产生任何意想不到的后果,或者我可以将其用于任何阵列并从此过上幸福的生活吗?应该是这样的
$arr = array ('apples' => 42);
$fruits = new ArrayAsObject($arr);
而不是
$fruits = ArrayAsObject(array ('apples' => 42));
出了什么错?
您没有使用new关键字,而是直接传递了数组。只有变量可以通过引用传递,这将导致通知。应该是这样的
$arr = array ('apples' => 42);
$fruits = new ArrayAsObject($arr);
而不是
$fruits = ArrayAsObject(array ('apples' => 42));
出了什么错?
您没有使用new关键字,而是直接传递了数组。只有变量可以通过引用传递,这将导致一个通知。我将从类中进行如下扩展:
class MyArrayObject extends ArrayObject{
public function offsetGet($name) {
if($this->offsetExists($name))
return parent::offsetGet($name);
}
}
使用offsetGet函数可以访问数组数据,因此如果调用$myObjectArray['test'],则会调用该函数。然后,如果您使用offsetExists检查是否设置了键,您将返回值。否则结果将为空
编辑:
如果要将其用作对象,则需要添加以下两个函数:
public function __get($name){
return $this->offsetGet($name);
}
public function __set($name, $value){
$this->offsetSet($name, $value);
}
我将从课堂扩展如下:
class MyArrayObject extends ArrayObject{
public function offsetGet($name) {
if($this->offsetExists($name))
return parent::offsetGet($name);
}
}
使用offsetGet函数可以访问数组数据,因此如果调用$myObjectArray['test'],则会调用该函数。然后,如果您使用offsetExists检查是否设置了键,您将返回值。否则结果将为空
编辑:
如果要将其用作对象,则需要添加以下两个函数:
public function __get($name){
return $this->offsetGet($name);
}
public function __set($name, $value){
$this->offsetSet($name, $value);
}
PHP已经输入了这样一个类,我将从这个类进行扩展:这取决于。也许更好的答案是,你需要标准化你的数据模型,这样你就可以确保指数的存在。也许您应该使用类来建模数据,而不是数组。是的,您的解决方案是帮助解决此特定问题的一个支柱。也许这正是你在特殊情况下需要的拐杖。但是也许你错过了树的森林。PHP已经输入了一个类似这样的类,我将从这个类扩展:这取决于。也许更好的答案是,你需要标准化你的数据模型,这样你就可以确保指数的存在。也许您应该使用类来建模数据,而不是数组。是的,您的解决方案是帮助解决此特定问题的一个支柱。也许这正是你在特殊情况下需要的拐杖。但也许你是因为树木而错过了森林。我删除了我的评论,那是在编辑之前。这没关系,因为这只是一个例子,而且OP没有报告任何相关问题:@RoyalBg,不,你会遇到通知的。因为阵列是直接受影响的,我明白了。但这里的参考点是什么。如果你有$fruits->apples=100;你不会真的改变阵列吧?var_dump$arr;仍将显示42?我删除了我的评论,这是在编辑之前。这没关系,因为这只是一个例子,而且OP没有报告任何相关问题:@RoyalBg,不,你会遇到通知的。因为阵列是直接受影响的,我明白了。但这里的参考点是什么。如果你有$fruits->apples=100;你不会真的改变阵列吧?var_dump$arr;还将显示42?哇,谢谢。这在各方面都更好。现在我甚至不用重写代码来使用对象。哇,谢谢。这在各方面都更好。现在我甚至不必重写代码来使用对象。