【问题标题】:Why isn't the array I return in my __construct class available in the following function?为什么我在 __construct 类中返回的数组在以下函数中不可用?
【发布时间】:2016-03-01 08:11:26
【问题描述】:

我编写了一个类,它在构造中访问数据库并获取名称列表。这些名称进入关联数组,例如('名称' => 'id')。

即重点是传入名字来取回一个ID:

$id = names::nameToId('some name');
print $id;
// prints int

问题是当我尝试从构造返回数组时出现错误:

注意:未定义变量:nameArray in (etc)

这是目前为止的代码:

class nameToId {
    public $nameArray;
    private $mysqli;

    public function __construct($mysqli) {
        ...
        while($row = mysqli_fetch_assoc($res)) {
            $nameArray[$row['name']] = $row['id'];
        }

        return $nameArray;
    }

    static public function nameToId($name) {
        $nameId = $nameArray[$name];
        return $nameId;
    }
}

$namesToId = new nameToId($mysqli);
$nameId = $namesToId::nameToId('some name');
echo $nameId;

为什么 $nameArray 不被传递给 nameToId()?我是新来的类,我想通过在我第一次创建类时将 $nameArray 声明为 public 来使它可用。我也尝试过让它全球化,尽管我知道这不是好的形式,但它仍然没有用。

【问题讨论】:

  • 因为使用new调用类构造函数总是返回类的实例,与任何代码无关在使用 return 语句的构造函数中,因此您的返回值被忽略 - PHP Docs
  • 你不应该返回数组,而是将它分配给 $this -> nameArray;
  • 如果要使用静态函数,则需要使用静态属性。看,你没有设置你班级的$nameArray;。将return $nameArray 更改为$this->nameArray=$nameArray;
  • 我已经尝试在构造中设置 $this->nameArray = $nameArray,但最终出现“致命错误:未捕获的错误:不在对象上下文中使用 $this”
  • 在不给出理由的情况下投反对票并没有多大作用。

标签: php function class


【解决方案1】:

因为你不能 return 来自构造函数的任何东西。任何return 值都将被忽略并进入以太。 $nameArray 是一个局部变量,不在任何其他范围内共享,即您无法在 nameToId 中访问它。此外,由于nameToIdstatic,它一开始就无法访问来自任何非静态方法(如__construct)的数据。

你可能想要这样的东西:

class nameToId {

    public $nameArray;
    private $mysqli;

    public function __construct($mysqli) {
        ...
        while ($row = mysqli_fetch_assoc($res)) {
            $this->nameArray[$row['name']] = $row['id'];
        }
    }

    public function nameToId($name) {
        return $this->nameArray[$name];
    }
}


$namesToId = new nameToId($mysqli);
echo $namesToId->nameToId('some name');

【讨论】:

  • 这是有道理的。感谢您对此进行解释。它有效。
【解决方案2】:

修复你的代码:

class nameToId {
    public static $nameArray;
    private $mysqli;

    public function __construct($mysqli) {

        $this->mysqli = $mysqli;
        $sql = 'SELECT id, name FROM teams';
        $res = mysqli_query($this->mysqli,$sql);

        while($row = mysqli_fetch_assoc($res)) {
            self::$nameArray[$row['name']] = $row['id'];
        }
    }

    static public function nameToId($name) {
        $nameId = self::$nameArray[$name];
        return $nameId;
    }
}

$namesToId = new nameToId($mysqli);
$nameId = $namesToId::nameToId('some name');
echo $nameId;

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 2021-03-22
    • 2011-10-31
    • 2012-10-03
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多