起因
封装数据库类的时候,写了一个静态方法querySql来执行一条sql语句,代码如下
/**
* query 执行一条sql语句
* @param string $sql sql语句
* @param boolean $single 是否查询单条 默认是
* @return array 执行结果
*/
public static function querySql($sql = "",$single = true)
{
$stmt = $this->pdo->query($sql);
if($single==true)
{
$data = $stmt->fetch(PDO::FETCH_ASSOC);
}else{
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$data[] = $row;
}
}
return $data;
}
经过
$pdo是保存的pdo对象,定义为private $pdo,我想在这个方法里使用pdo的query方法,报错了,信息如下
Fatal error: Using $this when not in object context in D:\phpbox\myphp_www\PHPTutorial\WWW\public\DB.php on line 31
查了资料发现在静态方法里不能使用$this,我改成如下
/**
* query 执行一条sql语句
* @param string $sql sql语句
* @param boolean $single 是否查询单条 默认是
* @return array 执行结果
*/
public static function querySql($sql = "",$single = true)
{
$stmt = self::$pdo->query($sql);
if($single==true)
{
$data = $stmt->fetch(PDO::FETCH_ASSOC);
}else{
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$data[] = $row;
}
}
return $data;
}
依然报错
Fatal error: Access to undeclared static property: DB::$pdo in D:\phpbox\myphp_www\PHPTutorial\WWW\public\DB.php on line 31
结果
再查资料,发现self是调用静态属性的,而且在静态方法里不能调用非静态成员,最后将方法改为非静态,查询成功
/**
* query 执行一条sql语句
* @param string $sql sql语句
* @param boolean $single 是否查询单条 默认是
* @return array 执行结果
*/
public function querySql($sql = "",$single = true)
{
$stmt = $this->pdo->query($sql);
if($single==true)
{
$data = $stmt->fetch(PDO::FETCH_ASSOC);
}else{
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$data[] = $row;
}
}
return $data;
}
总结
我犯了3个错误:
1.静态方法里面使用了$this
2.静态方法调用非静态成员
3.没理解self的用法
基础还是不够扎实,得多学习