前置当前命名空间的命名空间

时间:2016-04-12 18:51:48

标签: php class oop namespaces

我有一个类包装器,类car,它位于Automobile的命名空间中。然后我有tire类,它位于Automobile\Wheels的命名空间中。在轮胎类中,我想从car类中访问一个静态变量,但唯一的方法是引用完整的namespace \ class。

<?php

namespace Automobile;

class Car {
    public static $Axle;

    public function __construct() {
        static::$Axle = new Axle();
    }
}
<?php

namespace Automobile\Wheels;

class Tire {
    public $size;
    public function __construct($size = 16) {
        $this->size = $size;

        \Automobile\Car::$Axle->add_wheel($this);
    }
}

我的问题是:引用这样的课程是否可行?是否有任何方法可以引用该类而不包括该类的完整和绝对命名空间?

2 个答案:

答案 0 :(得分:1)

实际上并没有好的或坏的方法,尽管人们可能对此持相当的看法(使用空格或制表符来缩进相同,但是不要走那条路;))。只要它们被正确引用,就可以使用完全限定的类名。

您可能希望使用use关键字来“导入”外部类,这在我看来提高了可读性:

<?php
namespace Automobile\Wheels;

use Automobile\Car;

class Tire {
    public $size;
    public function __construct($size = 16) {
        $this->size = $size;

        Car::$Axle->add_wheel($this);
    }
}

您可能希望引用PHP documentation,因为它非常简洁,可以很好地了解如何使用命名空间。

答案 1 :(得分:0)

正如其他人所指出的,使用use作为完整的命名空间类(例如use Automobile\Car;)。从那里,您可以在文件的其余部分使用缩短的类引用(例如,Car)。

顺便说一下,如果可能的话,最好避免静态调用属性和方法。它通常被认为是注入依赖项的最佳实践,因为它解耦代码并允许使用接口交换应用程序的各个部分。

我会做这样的事情:

<?php

namespace Automobile;

class Car {
    /** @var Axle */
    public $axle;

    public function __construct(Axle $axle) {
        $this->axle = $axle;
    }
}
<?php

namespace Automobile\Wheels;

use Automobile\Car;

class Tire {

    public $size;

    public function __construct(Car $car, $size = 16) {
        $this->size = $size;
        $car->axle->add_wheel($this);
    }
}