我对在php中使用名称空间感到困惑,会尝试解释我使用我的项目中的问题
我在命名空间下面有一个类
namespace BigBlueButton;
class BigBlueButton
{
public function createMeeting($createMeetingParams, $xml = '')
{
//some code
return new CreateMeetingResponse($xml);
}
}
我用它作为
use \BigBlueButton;
$bbb = new BigBlueButton\BigBlueButton();
//then I try to reference the variable $bbb in a function but I can't
function easymeet_create_meeting($id) {
// $bbb = new BigBlueButton\BigBlueButton(); I don't want to create a new object here but reference the object I created above,something like this
$bbb=BigBlueButton\bbb;
}
但我似乎无法访问上述变量,即$ bbb,我尝试了global $bbb
,但$bbb
似乎不在全局命名空间中,我理解我我试图在上面的代码中访问一个常量的$ bbb,但无论如何我都告诉它要告诉我要做什么
答案 0 :(得分:2)
命名空间不会扩展到像这样的变量:
在PHP世界中,命名空间旨在解决两个问题 创建时遇到的库和应用程序的作者 可重用的代码元素,如类或函数:
- 您创建的代码与内部PHP类/函数/常量或第三方之间的名称冲突 类/功能/常数。
- 能够别名(或缩短)Extra_Long_Names,旨在缓解第一个问题,提高源代码的可读性。
醇>
http://php.net/manual/en/language.namespaces.rationale.php
您的班级声明没有问题,但是您错误地使用了use
关键字,因为它应该引用特定的类,而不是命名空间。
use \BigBlueButton\BigBlueButton;
function easymeet_create_meeting($id, BigBlueButton $bbb) {
/* ... */
}
$bbb = new BigBlueButton();
$result = easymeet_create_meeting(1234, $bbb);
您注意到我已将$bbb
移至功能参数中,因为global state is the devil。它也是type-hinted因为为什么不呢?
更好的是:
class BigBlueButton implements ButtonInterface {}
class BigRedButton implements ButtonInterface {}
和
function easymeet_create_meeting($id, ButtonInterface $bbb) {}
$result[] = easymeet_create_meeting(1234, new BigBlueButton());
$result[] = easymeet_create_meeting(5678, new BigRedButton());
现在我们正在研究Dependency Injection的基本知识,这是一个很好的习惯。
答案 1 :(得分:0)
如果我理解正确,问题不在于命名空间。
正如您所说,您可以尝试使用全局变量,例如:
use \BigBlueButton;
global $bbb;
$bbb = new BigBlueButton\BigBlueButton();
function easymeet_create_meeting($id) {
global $bbb;
// you can use it
}
或者您可以将变量发送到函数
function easymeet_create_meeting($id, $bbb) {
}
我不知道整个问题,但您也可以在类中使用单例设计模式,这样每次使用时都会得到相同的实例。