2015-06-25 2 views
0

Есть ли какой-либо способ получить какую-либо ошибку, будь то исключения, коды ошибок или протоколирование, когда алиасы, введенные use, не существуют?Как показать ошибки использования пространства имен?

Например, я попробовал этот (то есть, используя все ошибки сигнализации я знаю):

<?php 
ini_set('display_errors',1); 
ini_set('display_startup_errors',1); 
error_reporting(E_ALL); 

use \Foobar as Frob; // \Foobar is actually unknown 
print("still here\n"); 

Вместе с этой линией команды в Bash:

display_errors=on php love.php

и получить:

still here 

как единственный выход. Я посмотрел на php_errors.log, но ничего не было.

PHP-дизайнеры, в их очень ценном здравомыслии, наверняка что-то придумали?

Я понимаю, что use - это просто псевдоним для псевдоним в мире PHP, но я не понимаю, почему не должно быть ошибок для квалифицированных судей.

ответ

1

use заявления как таковые не действительно do ничего. Все, что они делают, это псевдоним имени с именами на другое имя по вашему выбору, отныне позволяя вам ссылаться на этот сокращенный псевдоним вместо полного имени. Вот и все. Больше ничего не происходит. На данный момент файл класса/функции/на самом деле не загружается, и никакой другой проверки не выполняется. Это связано с тем, что существует много способов загрузить фактический класс, к которому относится псевдоним, и вы можете захотеть сделать это после того, как это произойдет позже. Скорее всего, с помощью автозагрузчика, который будет пытаться загрузить класс, когда он впервые используется.

So: нет, нет способа кроме того, стараюсь использование класс.

$frob = new Frob; // Fatal error: class Foobar not found 
+0

+1 для образца кода.Но он читается, как ваш вступительный параграф, по причине отсутствия ошибок для квалифицированных судей, но на самом деле это не так. –

+0

Не знаете, что вы говорите. Философия в PHP, особенно с использованием автозагрузчиков, заключается в том, чтобы как можно больше отложить загрузку файлов. Даже если вы «используете» класс в верхней части файла, вы никогда не сможете его создать во время выполнения. Таким образом, это было бы ненужным успехом в производительности для загрузки и проверки файла, просто потому, что вы упоминали его в псевдониме 'use'. Это побочный продукт модели исполнения PHP. Ошибка может отображаться только в течение фактического времени выполнения, когда класс фактически используется. – deceze

+0

Я вижу. Было бы неплохо, если бы они дали это обоснование в своей документации по использованию. И имхо было бы просто назвать эту вещь _alias_. –

1

PHP не сообщает об ошибке, поскольку в коде отсутствует ошибка.

В заявлении use говорится, что Frob - это еще одно имя для \Foobar. Это просто объявление, PHP не пытается загрузить \Foobar или проверить, существует ли он в этой точке.

До тех пор, пока вы не используете Frob или \Foobar в коде, что объявление use не действует.

Но если вы пытаетесь использовать его:

$frob = new Frob(); 

и \Foobar не является классом, то убедитесь, что PHP вызовет фатальную ошибку и остановить выполнение сценария.

Объявление use работает как символические ссылки в файловой системе. Вы можете создать файл a, который является символической ссылкой на b, и пока вы не пытаетесь читать с a (или b), никто не заботится, существует ли b или нет.

Смежные вопросы