Call to a member function getMode() on null
vendor\colinmollenhour\credis\Client.php(783): Credis_Client->assertNotPipelineOrMulti('Credis_Client::...')
错误代码
php
#Credis_Client vendor\colinmollenhour\credis\Client.php
/**
* @param ?int $Iterator
* @param string $pattern
* @param int $count
* @return bool|array
* @throws CredisException
*/
public function scan(&$Iterator, $pattern = null, $count = null) {
$this->assertNotPipelineOrMulti(__METHOD__);
return $this->__call('scan', array(&$Iterator, $pattern, $count));
}
/**
* @param string $caller
* @return void
* @throws CredisException
*/
protected function assertNotPipelineOrMulti($caller) {
if ($this->standalone && ($this->isMulti || $this->usePipeline) ||
// phpredis triggers a php fatal error, so do the check before
!$this->standalone && ($this->redis->getMode() === Redis::MULTI || $this->redis->getMode() === Redis::PIPELINE)) {
throw new CredisException('multi()/pipeline() mode can not be used with ' . $caller);
}
}
报错是这个代码 "this-\>redis-\>getMode()",其中this->redis为空。
调用代码
php
$client = new Credis_Client();
$r = $client->select(15);
$data = $client->scan($client, "keywords:*", 1);
var_dump($data);
此时代码正常
php
$host = '127.0.0.1';
$port = 6379;
$timeout = null;
$persistent = '';
$db = 15;
$client = new Credis_Client($host,$port,$timeout ,$persistent,$db);
$data = $client->scan($client, "keywords:*", 1);
var_dump($data);
var_dump(123);
会报上面的错误,就是Credis_Client构造里$this->redis没初始化。
使用懒加载,都是调用方法之后实现连接,实例化$this->redis。
可以按照正常顺序调用,也可以改代码。
修改后代码
php
protected function assertNotPipelineOrMulti($caller) {
if (empty($this->redis)) {
$this->connect();
}
if ($this->standalone && ($this->isMulti || $this->usePipeline) ||
// phpredis triggers a php fatal error, so do the check before
!$this->standalone && ($this->redis->getMode() === Redis::MULTI || $this->redis->getMode() === Redis::PIPELINE)) {
throw new CredisException('multi()/pipeline() mode can not be used with ' . $caller);
}
}