Вернуть метод с переменным списком аргументов в качестве ссылки в PHP - PullRequest
4 голосов
/ 15 декабря 2011

Я пытаюсь вернуть значение из метода в качестве ссылки в PHP5.3. Возможно, я иду по этому совершенно неправильному пути, но я ускоряю работу над старым проектом с некоторыми новыми функциями 5.3+.

Ниже приведен пример, который я описал, чтобы объяснить, что происходит:

class Foo
{
    static $foobar = 5;

    function &bar()
    {
        return self::$foobar;
    }
}
// Doesn't work
//$test1 = &call_user_func_array(array("Foo","bar"),array());

// Doesn't work
//$test1 = &call_user_func_array("Foo::bar",array());

// Doesn't work
//$f = new Foo; $test1 = &call_user_func_array(array($f,"bar"),array());

// WORKS
//$test1 = &Foo::bar();

//Doesn't work
//$function = "Foo::bar";
//$test1 = &$function();

// WORKS
$f = new Foo; $test1 = &$f->bar();

$test2 = Foo::bar();

var_dump($test1);
var_dump($test2);

$test1 = 10;
echo "----------<br />";

var_dump($test1);
var_dump($test2);
var_dump(Foo::bar()); //returns 10 when working, 5 when not working

Самый последний Foo::bar() должен возвращать 10, так как $test1 должен быть ссылкой на Foo::$foobar, когда все работает.

Я понимаю, что в этом примере также используется какой-то устаревший PHP-вызов Foo::bar и метод bar() не указан как статический, но все еще может вызываться через ::

Любая помощь будет принята с благодарностью, так как единственное исправление, которое у меня есть, - это просто установить switch в списке аргументов и вызывать метод напрямую, исходя из количества существующих аргументов.

Ответы [ 3 ]

0 голосов
/ 06 марта 2012

Разве это не работает в PHP 5.2.5: http://codepad.org/uMEIK210 (обратите внимание на 10 как конечный результат)?

Полагаю, вы хотели бы видеть 10 три раза.

Для этого (что $test2 также является ссылкой на поле класса) необходимо указать & с обеих сторон: function &bar() и $test2 =& Foo::bar();

См. docs :

Примечание: В отличие от передачи параметров, здесь вы должны использовать & в обоих местах - чтобы указать, что вы хотите вернутьпосредством ссылки, а не копии, и для указания того, что привязка ссылки, а не обычное присвоение, должна выполняться для $ myValue.

Так что вам просто нужно отредактировать одну строку, чтобы получить (вероятно) желаемое 3 x 10:

$test2 =& Foo::bar();

Заключительный совет

Неиспользовать ссылки PHP

0 голосов
/ 11 марта 2012

Прежде всего, попробуйте объявить функцию статической.Также вызов должен быть нормальным вызовом.с префиксом ampersand, как уже отвечено.

class Foo
{
    static $foobar = 5;

    public static function &bar()
    {
        return self::$foobar;
    }
}

Вызов:

$test1 =& Foo::bar();

Кроме того, я не вижу веской причины для ссылки на статическую переменную.Статическая переменная - это переменная, которая не меняет значение между вызовами.По сути, это «глобальный» var, заключенный в пространство имен.Вам нужен только доступ для чтения из-за пределов класса, запись должна выполняться внутри, согласно принципу инкапсуляции.Нет необходимости в ссылке, правда ..

0 голосов
/ 15 декабря 2011

Это просто присвоение $ test1 значению $ foobar (которое равно 5)

$test1 = &$f->bar();

Это просто перезапись значения, содержащегося в $ test1, с помощью 10

$test1 = 10;

Если вы хотите обновить значение в Foo, используйте

$f->foobar = 10;
...