如何在 class 中调用全局对象函数,出现 "Undefined variable" 错误
How to call global object function inside class, getting "Undefined variable" error
我正在创建这个简单的 PHP 尝试使用 Predis 库在 Redis 上缓存请求,我在 class 之外实例化了我的 $redis 对象,我需要从内部调用它class 函数。但是我不断收到 Undefined variable: redis 消息。
我已经尝试从 class 范围内外调用我的缓存验证函数。
代码如下:
<?php
require "predis/src/Autoloader.php";
Predis\Autoloader::register();
global $redis;
$redis = new Predis\Client();
class SimpleJsonRequest
{
private $redisLocal;
public function __construct() {
global $redis;
$this->redisLocal =& $redis;
}
private static function makeRequest(string $method, string $url, array $parameters = null, array $data = null)
{
$opts = [
'http' => [
'method' => $method,
'header' => 'Content-type: application/json',
'content' => $data ? json_encode($data) : null
]
];
$url .= ($parameters ? '?' . http_build_query($parameters) : '');
return file_get_contents($url, false, stream_context_create($opts));
}
public static function get(string $url, array $parameters = null)
{
if(validateCache('GET', $url, $parameters))
return json_decode(self::makeRequest('GET', $url, $parameters));
}
public static function post(string $url, array $parameters = null, array $data)
{
if(validateCache('POST', $url, $parameters, $data))
return json_decode(self::makeRequest('POST', $url, $parameters, $data));
}
public static function put(string $url, array $parameters = null, array $data)
{
if(validateCache('PUT', $url, $parameters, $data))
return json_decode(self::makeRequest('PUT', $url, $parameters, $data));
}
public static function patch(string $url, array $parameters = null, array $data)
{
if(validateCache('PATCH', $url, $parameters, $data))
return json_decode(self::makeRequest('PATCH', $url, $parameters, $data));
}
public static function delete(string $url, array $parameters = null, array $data = null)
{
if(validateCache('DELETE', $url, $parameters, $data))
return json_decode(self::makeRequest('DELETE', $url, $parameters, $data));
}
}
function validateCache(string $method, string $url, array $parameters = null, array $data = null)
{
if($redis->exists($method)
&& $redis->get($method, 'url') == $url
&& json_decode($redis->get($method, 'parameters')) == $parameters
&& json_decode($redis->get($method, 'data')) == $data)
{
echo'request cached';
return false;
}
else
{
$redis->hMset($method, [
'url' => $url,
'parameters' => $parameters = null ? null : json_encode($parameters),
'data' => $data = null ? null : json_encode($data)
]);
$redis->expire($method, 10);
echo 'not cached';
return true;
}
}
$test = new SimpleJsonRequest();
print_r($redis);
echo $test->get('1');
echo $test->get('1');
我希望它先打印 "not cached",然后打印 "request cached",但我一直收到未定义变量错误。
您的 validateCache
函数正在引用 $redis
,但没有像您在 SimpleJsonRequest
构造函数中那样先将其声明为全局变量。
停止 global
。在 类 中,这通常是一种糟糕的做法,而且很糟糕。只需传递您需要的内容即可:
class SimpleJsonRequest
{
public function __construct($redis) {
$this->redis = $redis;
}
}
$redis = new Predis\Client();
$test = new SimpleJsonRequest($redis);
然后在任何需要的地方使用$this->redis
,例如validateCache
:
if($this->redis->exists($method)
&& $this->redis->get($method, 'url') == $url
&& json_decode($this->redis->get($method, 'parameters')) == $parameters
&& json_decode($this->redis->get($method, 'data')) == $data)
{
// rest of code
}
我正在创建这个简单的 PHP 尝试使用 Predis 库在 Redis 上缓存请求,我在 class 之外实例化了我的 $redis 对象,我需要从内部调用它class 函数。但是我不断收到 Undefined variable: redis 消息。
我已经尝试从 class 范围内外调用我的缓存验证函数。
代码如下:
<?php
require "predis/src/Autoloader.php";
Predis\Autoloader::register();
global $redis;
$redis = new Predis\Client();
class SimpleJsonRequest
{
private $redisLocal;
public function __construct() {
global $redis;
$this->redisLocal =& $redis;
}
private static function makeRequest(string $method, string $url, array $parameters = null, array $data = null)
{
$opts = [
'http' => [
'method' => $method,
'header' => 'Content-type: application/json',
'content' => $data ? json_encode($data) : null
]
];
$url .= ($parameters ? '?' . http_build_query($parameters) : '');
return file_get_contents($url, false, stream_context_create($opts));
}
public static function get(string $url, array $parameters = null)
{
if(validateCache('GET', $url, $parameters))
return json_decode(self::makeRequest('GET', $url, $parameters));
}
public static function post(string $url, array $parameters = null, array $data)
{
if(validateCache('POST', $url, $parameters, $data))
return json_decode(self::makeRequest('POST', $url, $parameters, $data));
}
public static function put(string $url, array $parameters = null, array $data)
{
if(validateCache('PUT', $url, $parameters, $data))
return json_decode(self::makeRequest('PUT', $url, $parameters, $data));
}
public static function patch(string $url, array $parameters = null, array $data)
{
if(validateCache('PATCH', $url, $parameters, $data))
return json_decode(self::makeRequest('PATCH', $url, $parameters, $data));
}
public static function delete(string $url, array $parameters = null, array $data = null)
{
if(validateCache('DELETE', $url, $parameters, $data))
return json_decode(self::makeRequest('DELETE', $url, $parameters, $data));
}
}
function validateCache(string $method, string $url, array $parameters = null, array $data = null)
{
if($redis->exists($method)
&& $redis->get($method, 'url') == $url
&& json_decode($redis->get($method, 'parameters')) == $parameters
&& json_decode($redis->get($method, 'data')) == $data)
{
echo'request cached';
return false;
}
else
{
$redis->hMset($method, [
'url' => $url,
'parameters' => $parameters = null ? null : json_encode($parameters),
'data' => $data = null ? null : json_encode($data)
]);
$redis->expire($method, 10);
echo 'not cached';
return true;
}
}
$test = new SimpleJsonRequest();
print_r($redis);
echo $test->get('1');
echo $test->get('1');
我希望它先打印 "not cached",然后打印 "request cached",但我一直收到未定义变量错误。
您的 validateCache
函数正在引用 $redis
,但没有像您在 SimpleJsonRequest
构造函数中那样先将其声明为全局变量。
停止 global
。在 类 中,这通常是一种糟糕的做法,而且很糟糕。只需传递您需要的内容即可:
class SimpleJsonRequest
{
public function __construct($redis) {
$this->redis = $redis;
}
}
$redis = new Predis\Client();
$test = new SimpleJsonRequest($redis);
然后在任何需要的地方使用$this->redis
,例如validateCache
:
if($this->redis->exists($method)
&& $this->redis->get($method, 'url') == $url
&& json_decode($this->redis->get($method, 'parameters')) == $parameters
&& json_decode($this->redis->get($method, 'data')) == $data)
{
// rest of code
}