我有一个类包装器,类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);
}
}
我的问题是:引用这样的课程是否可行?是否有任何方法可以引用该类而不包括该类的完整和绝对命名空间?
答案 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);
}
}