каскадное использование пространства имен в php с дочерними классами - PullRequest
3 голосов
/ 28 марта 2012

Я успешно использую класс с псевдонимом и пространством имен в родительском классе, но он не доступен в дочернем классе.Фактическая ошибка от автозагрузчика.Странно то, что функция работает в родительском классе и загружается нормально.Как я могу сделать класс, введенный use доступным в подклассах?

edit: рецепты не сохраняют состояния - имеет ли смысл делать их синглетами в Base, а затем ссылаться на них как на члены в дочернем классеMyTest?

У меня есть два файла:

Base.php:

namespace selenium;
use selenium\recipe\Cms as Cms;
class Base extends \PHPUnit_Framework_TestCase
{
    public function __construct()
    {
        Cms::staticfunc(); //works fine
    } 
}

MyTest.php:

class MyTest extends \selenium\Base
{
    public testMyTest()
    {
        Cms::staticfunc(); //errors here 
    }
}

1 Ответ

2 голосов
/ 29 марта 2012

Из комментария:

Я надеялся на способ каскадного использования, не дублируя эту строку среди 20 или около того дочерних классов

Это одна из самых больших проблем, с которыми я сталкиваюсь с пространством имен PHP, которую вы должны вызывать use для каждого файла, к которому необходим текущий скрипт. Это та же самая ситуация, с которой мы сталкивались при необходимости вызвать require_once 20 раз для некоторых сценариев, чтобы добавить необходимые библиотеки.

Что я предпочитаю делать, так это пространство имен моих файлов (поскольку они находятся в файловой системе, как это делает Zend Framework) и использование автозагрузчика, чтобы избежать всего беспорядка. В настоящее время я использую автозагрузчик ZF , который можно использовать вне фреймворка, или вы также можете использовать реализацию vanilla PHP, используя SplAutoload .

- Обновление -

У меня есть библиотека, которую я написал за последние несколько лет, которая называется Hobis_Api и расположена в файловой системе с тем же соглашением; ~ / Проекты / проекты / дп / HOBIS / Библиотека / HOBIS / Api / *. Чтобы зарегистрировать пространство имен в Zend_Loader, я делаю следующее:

// Be sure to set the include path to include the Zend and Hobis_Api files
// Not sure how your setup is, but would look something like:
set_include_path(get_include_path() . ':' . DIRNAME(__FILE__));

require_once 'Zend/Loader/Autoloader.php';

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace(
    array(
        'Hobis_Api_'
    )
);

Обычно приведенный выше код помещается в некоторый файл начальной загрузки, который вы можете вызвать из централизованного скрипта, чтобы зарегистрировать автозагрузчик, один раз.

Теперь, если ваш путь включения задан правильно, каждый раз, когда вы ссылаетесь на Hobis_Api_*, он будет автоматически загружен для вас, поэтому вам не нужно вызывать use или require_once, пример использования:

// SomeScript.php

// Notice no requires

// I can make a call to Hobis_Api_Image without error
$image = Hobis_Api_Image;
$image->setHeight(400);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...