PHP определить переменную, содержащую класс - PullRequest
0 голосов
/ 22 июня 2011

Я пытаюсь определить __invoke способный глобальный экземпляр класса, который содержит функции моего приложения. По сути, я пытаюсь создать пространство имен для своей библиотеки, и поэтому я пытаюсь использовать класс для хранения всех моих функций / методов.

Я не хочу включать global $class_instance в начало всех моих файлов, потому что это ужасно.

Также мне не нужно ссылаться на переменную, как $GLOBALS['myvar'] везде.

Лично я нахожу это настоящим упущением в php.

Похоже, я не могу определить суперглобальные символы, такие как $myFunctionsGlobal И я не могу определить переменные (ну, на самом деле, константы) в PHP как myvar=$classInstance.

* 1017 Namespaces *

Если пространства имен должны решить эту проблему, почему они не используются более широко?

Например, Kohana не использует пространства имен вместе со многими другими библиотеками php.

Тот, который я ищу:

class _namespace{
    public $_function;
    function __invoke($arg){
        // Function body
        echo $arg;
    }
    function method(){
        ;
    }
}
$N = new _namespace;


$N('someValue');
$N->method();
function myFunc(){
    // I don't want global $N;
    // I don't want $N = $_GLOBALS['N'];
    // I don't want $N = get_instance();
    $N('some other value');
}

Решение:

В большинстве других языков, таких как c и js, вы можете иметь только один объект / функцию на имя переменной. PHP кажется особенным, позволяя вам иметь namespaces, functions и classes с одинаковыми именами. Я пытался сгруппировать все свои функции в одну центральную переменную для простоты, и все еще имел функциональность __invokable. Фактически, класс и функция, названные одинаково, предоставили бы эту функциональность.

<?

class R{
    static function static_method(){
        ;
    }
    function method(){
        ;
    }
}
function R(){;}

R();
R::static_method();

$instance = new R();
$instance->method();

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

namespace.php

<? namespace Z;

function init($arg=''){
    echo $arg;
}

function method(){
    echo 'method';
}

function method(){
    echo 'method2';
}

othefile.php

include('namespace.php');

function Z($a=null,$b=null){
    return Z\init($a,$b);
}

Z('test');
Z\method();
Z\method2();

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Вот мой новый ответ для вас, это работает

class _bidon {
    static function __invoke($arg){
        // Function body
        echo $arg;
    }
}

$b = new _bidon;
$b('eee');

function myFunc(){
    // I don't want global $N;
    // I don't want $N = $_GLOBALS['N'];
    // I don't want $N = get_instance();
    _bidon::__invoke('some other value');
}
myFunc();

но функция будет специфичной для класса, а не для объекта

------ Предыдущее сообщение:

Привет, я не совсем понял, но если у вас есть созданный класс, просто сделайте:

public static $myFunctionsGlobal;

и когда вы хотите использовать его вне вашего класса, вы делаете:

myclassname::$myFunctionsGlobal

и он будет доступен, как только вы включите свой класс

вам не нужно создавать объект, потому что это статическая переменная, вам просто нужно включить класс

0 голосов
/ 22 июня 2011

Вы можете использовать сервисный контейнер.

Пример, который вы можете найти здесь: Какой шаблон следует использовать для моего уникального экземпляра класса User? и для углубления Если синглтоны плохие, то почему сервисный контейнер хорош?

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

Приложение

С сервисомконтейнер, который я предлагаю, вы все еще можете использовать __invoke.

$obj = app('CallableClass');
$obj(5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...