2016-04-12 3 views
0

У меня есть оболочка класса, класс car, который живет в пространстве имен Automobile. Тогда у меня есть класс tire, который живет в пространстве имен Automobile\Wheels. В классе шин я хочу получить доступ к статической переменной из класса автомобиля, но единственный способ сделать это - ссылаться на полное пространство имен \ класс.Пространства имен, которые добавляют текущее пространство имен

<?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;', который будет препятствовать вам использовать 'автомобилей 'как класс в том же пространстве имен в этом файле. Остерегайтесь столкновений, которые вы можете избежать, используя псевдонимы 'use Automobile \ Car as 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); 
    } 
} 
Смежные вопросы