Стандартная библиотека PHP содержит довольно много полезных классов, но их использование в «нестандартных» пространствах имён может иметь один характерный нюанс.
Дело в том, что если какой-либо созданный вами класс отнесён к пространству имён,то при использовании в нём в стандартных классов PHP по умолчанию будет пытаться найти их в том же пространстве имён, что и основной класс.
Приведём пример.
Допустим, у нас есть класс некий контроллер на Yii 2 и в нём есть действие, в котором выполняется проверка истечения срока выполнения некоторой задачи. Проверка выполняется при помощи стандартного класса DateTime.
1 2 3 4 5 6 7 8 9 10 11 |
public function actionView($id) { $model = $this->findModel($id); if((new DateTime($model->deadLine_date)) < (new DateTime())){ $errorMessage="Срок выполнения задачи истёк!"; Yii::$app->session->setFlash('error_message', $errorMessage); } return $this->render('view', [ 'model' => $model ]); } |
На первый взгляд, код выглядит абсолютно правильным. Но, при вызове этого действия произойдёт ошибка, т. к. класс контроллера находится в особом пространстве имён app\controllers, а класса DateTime в этом пространстве имён нет.
Первое, что напрашивается сделать — указать пространство имён. Но, класс DateTime ни к какому пространству имён не отнесён. Он появился в версии 5.2, в то время как пространства имён впервые стали доступны в версии 5.3. Как быть?
На самом деле для подобных ситуаций в PHP предусмотрено простое и эффективное решение. Нужно добавить символ «\» перед именем такого класса и тогда PHP «поймёт», что речь идёт о классе, для которого пространство имён не определено и сможет правильно интерпретировать код.
Метод действия представленный ниже выполнится уже без ошибок.
1 2 3 4 5 6 7 8 9 10 11 |
public function actionView($id) { $model = $this->findModel($id); if((new \DateTime($model->deadLine_date)) < (new \DateTime())){ $errorMessage="Срок выполнения задачи истёк!"; Yii::$app->session->setFlash('error_message', $errorMessage); } return $this->render('view', [ 'model' => $model ]); } |
Данное обстоятельство следует обязательно учитывать при работе не только со стандартными, но и любыми другими классами, для которых не определено пространство имён, если вы ведёте разработку на современных фреймворках или просто используете пространства имён в своём коде.
Добавить комментарий