За исключением отсутствующего ключевого слова при объявлении $myVariable
, это вообще не должно выдавать ошибку, потому что внутри test()
функция $body
равна NULL
, если вы не определили ее в глобальной области видимости. Другими словами, ваш myCallback никогда не должен вызываться. Очевидно, вы определили $body
в глобальной области видимости и сделали это отличным примером того, почему использование глобальных переменных приведет к всевозможным неожиданным действиям. Если вы определили бы $callback
в глобальной области видимости для хранения «myCallback», это должно сработать, но вам не нужны глобальные переменные.
И сделайте себе одолжение и избавьтесь от функции в методе:
class myClass {
protected $_myVariable = 'myCallback';
public function myFunction()
{
// calling callback that calls callback (should make you think ;))
// that would be your curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'test');
echo call_user_func_array(
array($this, '_test'),
array('body', 'foo', 'bar'));
}
protected function _test($body, $handle, $line)
{
if ($body) {
call_user_func($this->_myVariable, $line);
}
if ($line === "\r\n") {
$body = true;
}
return strlen($line);
}
}
Функция test()
теперь является методом внутри вашего класса. Это намного понятнее и проще в обслуживании, чем помещение потока кода в какую-либо функцию внутри метода. Обратите внимание, что я передаю $body
в качестве первого аргумента. Я не знаю, как cURL принимает обратные вызовы или что он передает им. Если вы не можете сделать $body
первым аргументом, сделайте его проверкой члена класса на предмет его состояния с помощью $this->body
(, как теперь показано Филиппом ниже )