Первое, что вы захотите посмотреть на следующую строку:
class Model_Acl extends Zend_Acl
Это причина, по которой вам нужно следующее:
require_once ('Zend/Acl.php'); // gives error w/o
Чтобы получитьчтобы все работало без добавления строки выше, вам нужно настроить пути включения, чтобы автозагрузчик мог найти файл Acl.php, который находится непосредственно в каталоге 'Zend'.Вы включаете путь, просто нужно включить каталог, который является родителем каталога 'Zend'.Обычно это будет ваша «библиотечная» директория.
Что касается «родительской» проблемы:
Use of undefined constant parent - assumed 'parent'
Вы видите это, потому что у вас есть следующий код:
if (method_exists(parent, '__construct')) parent::__construct();
Что на самом деле должно быть:
if (method_exists(get_parent_class($this), '__construct')) parent::__construct();
В качестве альтернативы вы можете написать следующее:
method_exists(get_parent_class($this), '__construct') && parent::__construct();
Это немного более кратко (столько, сколько можно получить с помощью PHP)и чуть меньше шума.
Причина этого?
Самая первая вещь в строке (крайний левый) - это "method_exists", который является быстрым индикатором того, что это то, что нас волнуетоколо.Самый конец строки (крайний левый, кроме точки с запятой) является конечным результатом.Кроме того, && в целом является хорошим индикатором того, что после него должен быть только один оператор.Если это изменится, легко увидеть, что весь оператор, скорее всего, необходимо пересмотреть, а не присоединять другой оператор после parent :: __ construct ();
EDIT: дополнительная информация о автозагрузке:
создайте файл autoload.php.dist в корне вашего проекта (замените '/ PATH / TO / YOUR / PHP5 / LIB / DIR'):
<?php /* autoload.php.dist */
$includePaths = array( realpath('/PATH/TO/YOUR/PHP5/LIB/DIR'), get_include_path());
set_include_path( join(\PATH_SEPARATOR, $includePaths) );
spl_autoload_register(function($className) {
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strripos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}, true, true);
Создайте загрузчик, который можно использовать повторно(bootstrap.php)
<?php /* bootstrap.php */
if (file_exists($file = __DIR__.'/autoload.php')) {
require_once $file;
} elseif (file_exists($file = __DIR__.'/autoload.php.dist')) {
require_once $file;
}
Создайте файл phpunit.xml.dist, который использует ваш bootstrap.php (замените './your/test/directory/here'):
<?xml version="1.0" encoding="UTF-8"?>
<!-- phpunit.xml.dist -->
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="./bootstrap.php"
>
<testsuites>
<testsuite name="Test Suite">
<directory>./your/test/directory/here</directory>
</testsuite>
</testsuites>
</phpunit>
Теперь вы можете запустить phpunit из корневого каталога проекта.