在php中命名空格

时间:2016-03-28 20:41:02

标签: php namespaces static-members

我对在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,但无论如何我都告诉它要告诉我要做什么

2 个答案:

答案 0 :(得分:2)

命名空间不会扩展到像这样的变量:

  

在PHP世界中,命名空间旨在解决两个问题   创建时遇到的库和应用程序的作者   可重用的代码元素,如类或函数:

     
      
  1. 您创建的代码与内部PHP类/函数/常量或第三方之间的名称冲突   类/功能/常数。
  2.   
  3. 能够别名(或缩短)Extra_Long_Names,旨在缓解第一个问题,提高源代码的可读性。
  4.   

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) {

}

我不知道整个问题,但您也可以在类中使用单例设计模式,这样每次使用时都会得到相同的实例。