【问题标题】:PHP Fatal Error: Cannot use object of type DataAccess as arrayPHP 致命错误:不能将 DataAccess 类型的对象用作数组
【发布时间】:2023-03-13 01:08:02
【问题描述】:

我无法弄清楚为什么我在 PHP 中收到以下错误:

致命错误:无法在第 16 行的 /filename 中使用 DataAccess 类型的对象作为数组。

文件的相关代码如下:

class StandardContext implements IStandardContext
{
    private $dataAccess;

    // (CON|DE)STRUCTORS
    function __construct($config)
    {
        $this->dataAccess = new DataAccess($config['db']); //this is line 16
    }

$config 指的是以下内容:

$config = require(dirname(__FILE__)./*truncated*/.'Config.php');

这里是Config.php的相关代码:

return array(

    // Database connection parameters
    'db' => array(
        'host' => 'localhost',
        'name' => 'visum',
        'user' => 'root',
        'password' => ''
    )
);

以下是DataAccess对象的相关代码:

class DataAccess
{
    private $link;
    private $db;

    function __construct($dbConfig)
    {            
        $this->link = mysql_connect( $dbConfig['host'], $dbConfig['user'], $dbConfig['password'] ) or die(mysql_error());
        $this->db = $dbConfig['name'];
        mysql_select_db($this->db) or die(mysql_error());
    }

任何帮助将不胜感激,我对 PHP 还很陌生,完全被难住了。

编辑:顺便说一句,我已经包含了以下代码来测试 StandardContext,它确实有效(即,它允许我对我的数据库进行比我显示的更远的更改)

class StandardContext_index_returns_defined_list implements ITest
{
    private $dataAccess;

    function __construct($config)
    {
        $this->dataAccess = new DataAccess($config['db']);
    }

【问题讨论】:

  • Doh,做了一个愚蠢的评论,我愚蠢的 iPhone 不让我删除它:)
  • 您在实例化 DataAccess 对象之前是否执行了var_dump($config['db']); 以确保它确实是一个数组?查看您的代码,它似乎没问题。唯一缺少的另一件事是您的 Config.php 中 return array 周围的函数包装器,很高兴看到它的完整图片。
  • 奇怪的是,当我用 'var_dump($config['db']);' 替换第 16 行时我继续收到完全相同的错误消息。
  • 另外,我没有在 Config.php 上显示的唯一代码是
  • var_dump($config) 呢?

标签: php constructor data-access


【解决方案1】:

这几乎就像您尝试使用单例模式一样,但是对于您实例化的每个 StandardContext 对象,您都在传递数据库参数(通过 $config 数组)。我认为发生的事情是您多次传递 $config 数组,在第一次传递之后,$config 不再是数组,而是 DataAccess 类的实例,这就是您收到该错误的原因。您可以尝试以下方法:

class StandardContext implements IStandardContext
{
    private $dataAccess;

    // (CON|DE)STRUCTORS
    function __construct($config)
    {
        if ($config instanceof DataAccess) {
            $this->dataAccess = $config;
        } elseif ((is_array($config)) && (array_key_exists('db', $config))) {
            $this->dataAccess = new DataAccess($config['db']); 
        } else {
            throw new Exception('Unable to initialize $this->dataAccess');
        }
    }

【讨论】:

    【解决方案2】:

    这是你的问题

    private $dataAccess;
    

    在这里检查数组对象

    http://www.php.net/manual/en/class.arrayobject.php

    每当您在类内的方法之外声明时,它将被视为 Object ,因此您必须声明内部方法或声明为方法本身,否则从您的类中删除实现。

    您的 $dataAccess 是一个 Object ,因为您在方法之外声明它并且您的 new DataAccess($config['db']) 将返回一个 arrayObject 因为您实现了它,所以它试图从 Object 转换为 arrayObject 线索一个错误

    【讨论】:

    • 那个链接有点简洁。你的意思是因为$dataAccess是一个数组,所以必须在方法内部声明,否则数组会被转换成对象,导致这个错误?
    • @Indy $dataAccess 是一个 Object ,因为您在方法之外声明它并且您的 new DataAccess($config['db']) 将返回一个 arrayObject 因为您实现了它,所以它试图从 Object 转换为 arrayObject 会导致错误
    • 这有点道理,但我看不到我在哪里实现了arrayObject。我认为您必须明确声明它(即 new ArrayObject(); )。我之所以犹豫要不要接受,是因为我的测试代码基本相同,而且它可以工作。请参阅原始帖子上的编辑。感谢您的耐心罗宾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多