Я пытаюсь определить __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();