Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将数组转换为对象以自动执行数组\u键\u exists()_Php_Arrays_Oop - Fatal编程技术网

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?哇,谢谢。这在各方面都更好。现在我甚至不用重写代码来使用对象。哇,谢谢。这在各方面都更好。现在我甚至不必重写代码来使用对象。