Сделать объект доступным в функциях php, не передавая их и не делая их глобальными - PullRequest
1 голос
/ 19 апреля 2010

Это требование только для простоты для разработчиков и красивого кода. Я строю систему шаблонов, и мне бы очень хотелось, чтобы переменная объекта просто присутствовала во всех функциях. Вот некоторый код:

Librarian.php:

$class = "slideshow";
$function = "basic";
$args = array(...);
$librarian = $this; // I WOULD LIKE THIS TO BE PRESENT IN CALLED FUNCTION

...

return call_user_func($class.'::'.$function, $args);

...

Slideshow.php:

public static function basic($args) {
    echo $librarian; // "Librarian Object"
}

Спасибо! Мэтт Мюллер

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

У вас может быть функция, которую вы используете:

public static function basic($args) {
    echo librarian();
}

// some other file
function librarian()
{
    global $librarian;
    // does some stuff
}

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

Ты это имел ввиду?

1 голос
/ 19 апреля 2010

Полагаю, вы могли бы использовать синглтон, но это бы несколько попало в категорию global.

class Librarian
{
    static $instance = null;

    function __toString()
    {
        return 'Librarian Object';
    }

    function foo()
    {
        return 'bar';
    }

    function singleton()
    {
        if (is_null(self::$instance))
        {
            self::$instance = new Librarian();
        }

        return self::$instance;
    }
}

function basic()
{
    echo Librarian::singleton(); // Librarian Object
    echo Librarian::singleton()->foo(); // bar
}

Вы также можете иметь синглтон вне класса:

class Librarian
{
    function __toString()
    {
        return 'Librarian Object';
    }

    function foo()
    {
        return 'bar';
    }
}

function singleton()
{
    static $instance = null;

    if (is_null($instance))
    {
        $instance = new Librarian();
    }

    return $instance;
}

function basic()
{
    echo singleton(); // Librarian Object
    echo singleton()->foo(); // bar
}

То, что вы хотите, невозможно, по крайней мере, я не вижу простого или элегантного способа сделать это.

...