2013-02-21 1 views
1

Это эксперимент с пространством имен PHP/автозагрузкой в ​​одном файле.PHP-пространство имен и глобальный автозагрузка одного файла

namespace trust; 

class trust_network{   
    public function __construct(){  
     print "SUP"; 
    } 
} 

namespace trust2; 

$trust = new \trust\trust_network(); $do = new \test(); 

function __autoload($class){ 
    require($class.".php");  
    print $class; 
} 

Так под пространством имен trust2, я звоню «\ тест» - иначе я хотел бы автозагрузку этого класса из внешнего файла на глобальную базе данных. То, что я написал, не работает. Я знаю, что у меня есть __autoload в пространстве имен, но как я объявляю это на глобальной основе? Невозможно включить до объявления пространства имен.

ответ

3

Для нескольких пространств имен в одном файле вы должны использовать фигурный синтаксис брекета:

namespace n1 { 
... 
} 
namespace n2 { 
... 
} 
namespace { 
... 
} 

В последнем блоке можно объявлять функции в глобальном пространстве имен. Ссылка: http://www.php.net/manual/en/language.namespaces.definitionmultiple.php

+0

Это действительно работает, есть ли способ сделать это, свернув его? –

+1

Документация по PHP говорит, что синтаксис без фигурных скобок «не рекомендуется для объединения пространств имен в один файл, вместо этого рекомендуется использовать альтернативный синтаксис в квадратных скобках». –

+0

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

2

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

/index.php

function __autoload($class){ 
    // You may need to convert backslashes in $class to forward slashes 
    // and strip the first slash, we'll leave the 
    require($class.".php"); 
    // debug-only: print $class; 
} 
// Calling new here triggers __autoload to be called 
$trust = new \trust\trust_network(); 
$do = new \test(); 

/trust/trust_network.php

namespace trust; 

class trust_network{   
    public function __construct(){  
     print "TRUST_NETWORK"; 
    } 
} 

/test.php

class test() { 
    public function __construct(){  
     print "TEST"; 
    } 
} 

Обратите внимание, что вместо этого вы должны использовать spl_autoload_register, так как он позволяет нескольким системам подключаться к своим собственным режимам автозагрузки. Начиная с PHP 5.3, вы можете сделать следующее:

spl_autoload_register(function ($class) { 
    require($class.".php"); 
}); 
+0

Хуан, это правильно, но целью здесь является попытка этого в одном документе. –

+0

@MichaelMikhjian Почему? –

+0

Почему бы и нет. Не то, чтобы это было использовано в реальном мире, но чтобы подтолкнуть PHP к его пределам. –

 Смежные вопросы

  • Нет связанных вопросов^_^