Php 为什么不是';在我的_构造类中返回的数组在以下函数中是否可用?
我已经编写了一个类,它在构造中访问数据库并获得一个名称列表。这些名称进入关联数组,例如('name'=>'id') i、 e.重点是传入名称以获取ID: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
$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”而不给出原因的向下投票没有多大作用。这是有意义的。谢谢你的解释。它是有效的。