2016-04-12 113 views
0

我有一个类包装类car,它位于Automobile的命名空间中。然后我有tire类,它位于Automobile\Wheels的命名空间中。在轮胎类中,我想从car类访问静态变量,但唯一的方法是引用完整的名称空间\ 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

您可以添加使用语句文件'使用的顶级汽车\汽车;'那么这将让你使用'汽车'作为该文件中相同名称空间中的类。小心碰撞,你可以避免与别名'使用汽车\ Car作为CarAliasHere;'。这将允许您在该文件中使用“CarAliasHere”。 – JimL

+0

这很有效。我尝试过'使用Autmobile;'但是在类的最后添加了类名是它做的。设置别名也有帮助。谢谢! – helllomatt

回答

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,因为它是相当简洁关于主题并对如何使用名称空间给出了很好的见解。

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); 
    } 
}