PHP可以将命名空间扩展为本机使用类外的函数

时间:2013-11-04 11:29:19

标签: php namespaces

好的是这个场景:

以下是两个示例类。

  1. 第一个定义了类名外的一些函数。
  2. 我希望第二个类能够实现它,就像它本地定义一样。
  3. 我经常使用一些功能。

    因此,我需要它们尽可能地缩短可读性和写入速度。

    如果我可以将它们粘贴在命名空间中并以某种方式扩展它,它还可以防止其他库中可能的冲突。

    基础课程

    namespace Core;
    
    class Base{
      ......
    }
    
    function set($array, $path=null, $value=null){
      .....
    }
    
    function get($array, $path=null){
      .....
    }
    

    第二课

    namespace Core\Config;
    
    class Config{
      public function __construct($array){
        $conf = get($array, 'key1.key2.key3');
        .... do something with returned value ....
      }
    }
    

2 个答案:

答案 0 :(得分:1)

我看不出如何在课堂内使用functions,即使它们在没有$this->$object->的同一个课程中也是如此。我可以非常粗略地提供的解决方案是实例化Base类,如果你无法扩展它(一个名为Base的类似乎应该扩展,但无论如何):

namespace Core\Config;

class Config{

  private $_base;

  public function __construct($array){
    $this->_base = new Core\Base();
    $conf = $this->_base->get($array, 'key1.key2.key3');

或者,包装它们:

class Config {

    public function get($array, $path=null) {
        $base = new Core\Base();
        return $base->get($array, $path);
    }

    public function __construct($array) {
        $conf = $this->get($array, 'key1.key2.key3');
    }

好的,现在我看,它们是文件中的函数,包含类。

namespace Core\Config;
use Core;
class Config {
    public function __construct($array) {
            $conf = Core\get($array, 'key1.key2.key3');
        }

或者为了减少工作量,您可以为gore as C添加别名

答案 1 :(得分:1)

有人已经说明了但不是以正确的方式:

<?php
namespace Base {
    function get() {...}
}

namespace Base\Config {
    use \Base as B;

    class Config {
        public function __construct(...) {
            $something = B\get(...);
        }
    }
} 

您可以导入Base命名空间并对其进行别名并使用它 但是,您无法导入函数或常量(仅限类和接口)

参考:PHP.net


另请注意,您不能在类名之外的类中定义函数 你正在做的是在一个文件中定义一个类和几个“独立”函数,但它们在某种程度上没有关联(但它们在同一个命名空间中)。