Php 为什么不是';在我的_构造类中返回的数组在以下函数中是否可用?

Php 为什么不是';在我的_构造类中返回的数组在以下函数中是否可用?,php,function,class,Php,Function,Class,我已经编写了一个类,它在构造中访问数据库并获得一个名称列表。这些名称进入关联数组,例如('name'=>'id') i、 e.重点是传入名称以获取ID: $id = names::nameToId('some name'); print $id; // prints int 问题是,当我尝试从构造返回数组时,我得到一个错误: 注意:未定义变量:nameArray in(etc) 以下是迄今为止的代码: class nameToId { public $nameArray; pr

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

i、 e.重点是传入名称以获取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会使它可用。尽管我知道这不是一个好的形式,但我还是尝试将其全球化。修复您的代码:

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;

因为您不能
从构造函数返回任何内容。任何
返回值
都将被忽略,并直接进入以太
$nameArray
是一个局部变量,不在任何其他作用域中共享,即您不能在
nameToId
中访问它。此外,由于
nameToId
静态的
,因此它不能从任何非静态方法(如
\u 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');

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