Разбирайтесь сами с другими серверами. Я сразу сказал, что поддержка будет только для OpenServer. Скорее всего, в вашем случае папка www должна называться public_html или htdocs, или как ещё она в mamp по умолчанию называется.
Привет, Артем, возникла проблема:
в папке myproject.loc находятся 2 папки (www и src), т.е. если переходить по адресу http://myproject.loc, хоть с GET-запросом, хоть без, можно увидеть лишь 2 этих каталога, ведь index-файла там нет, он находится в папке www. Где я что-то упустил? Это важно, т.к. в следующем уроке возникают те же проблемы. (Windows, Open Server).
Спасибо,теперь все работает. Проблема была в настройках OpenServer, в автопоиске доменов. Пользователь Tina в комментариях выше, возможно, тоже имела в виду что-то подобное, хоть у нее и не Openserver.
после добавления данной строки
use MyProject\Models\Users\User; http://autohit.pro/ страница не доступна, перекопировал все коды, все страниц, не пашит.
А разве не нужно у функций, которые ничего не возвращают (main(), sayHello()) ставить тип возвращаемого значения void? Уроками ранее на этом в комментариях делался сильный акцент.
Так что, нельзя таким образом использовать инструкцию use, чтобы задать короткое имя для использованного в index.php класса? Хотя тут класс контроллера использован всего один раз в коде, может в этом и нет особого смысла, интересна сама возможность этого в принципе. Ну и код работает, никаких ошибок, предупреждений я ни в шторме, ни в браузере при запуске не видел. Все корректно работает.
путь неймспейса должен соответствовать файловой структуре проекта
Так я же неймспейс вообще не пишу в индексе, а ссылаюсь на путь к классу контроллера с помощью use. Я же не пишу в индексе неймспейс для индекса.
Вот index.php:
<?php
use MyProject\Controllers\MainController;
spl_autoload_register(function (string $className) {
require_once __DIR__ . '/../src/' . $className . '.php';
});
$controller = new MainController();
if (!empty($_GET['name'])) {
$controller->sayHello($_GET['name']);
} else {
$controller->main();
}
Я не пойму, чем это отличается от вот этой ситуации:
Либо же указать в начале файла о каком классе идёт речь, когда мы используем в коде только слово User. Делается это с помощью слова use после указания текущего неймспейса, но перед описанием класса.
<?php
namespace MyProject\Models\Articles;
use MyProject\Models\Users\User;
class Article
{
private $title;
private $text;
private $author;
public function __construct(string $title, string $text, User $author)
{
$this->title = $title;
$this->text = $text;
$this->author = $author;
}
public function getTitle(): string
{
return $this->title;
}
public function getText(): string
{
return $this->text;
}
public function getAuthor(): User
{
return $this->author;
}
}
Теперь, когда мы будем использовать класс User, то автоматически будет использоваться класс из неймспейса MyProject\Models\Users\User.
Тут тоже используется use, чтобы не писать длинный путь к другому классу, который используется в данном. Use и namespace же не связаны тут. Namespace указывает на порстранство имен текущего класса, а use указывает на пространство имен другого использованного класса в текущем. Или я не прав?
Я так понял, мы создали файл MainController и в нём создали класс - который является 'моделью', мы её описали, в дальнейшем мы передали в 'контролер', и уже с 'контролера' передали сформированный результат в 'представление'?
Если я конечно правильно понял.
Я думал что класс 'Controller' и его описание это и есть модель (свойства и методы) :/
Можете подсказать пожалуйста что в данном контроллере послужило моделью?
Warning: require_once(C:\openserver\domains\myproject.loc\www/../src/MyProject/Controllers/MainController.php): failed to open stream: No such file or directory in C:\openserver\domains\myproject.loc\www\index.php on line 4
Fatal error: require_once(): Failed opening required 'C:\openserver\domains\myproject.loc\www/../src/MyProject/Controllers/MainController.php' (include_path='.') in C:\openserver\domains\myproject.loc\www\index.php on line 4
Ошибка, всё сделал как тут описано и смотрел в гитхабе (код такой же)
пока не залез на гит - ничего не работало. Правильно ли я понимаю что обычно сервера не используют unix и проблемы такой скорее всего не будет, и это просто частная ошибка из-за того что я на маке?
ок
=)
Да что-ж такое то! Третий урок без домашки. Преподу тройку за лень!
Будет ещё домашка. Пока просто запоминай :)
Вы уверены что пути правильные? Все сделала как написано, но не работает. Путь до проекта на сервере имяПроекта/www
За 2 года только у вас ошибка возникла. Что не работает-то?
500 ошибка. Работаю mamp pro +vphpstorm
Разбирайтесь сами с другими серверами. Я сразу сказал, что поддержка будет только для OpenServer. Скорее всего, в вашем случае папка www должна называться public_html или htdocs, или как ещё она в mamp по умолчанию называется.
у меня такая же тема, просто стал сокращать пути на папку или дополнять другую и всё хорошо.
<?php
spl_autoload_register(function (string $className) {
require_once DIR . '/../' . $className . '.php';
});
$controller = new \MyProject\Controllers\MainController();
if (!empty($_GET['name'])) {
$controller->sayHello($_GET['name']);
} else {
$controller->main();
}
Привет, Артем, возникла проблема:
в папке myproject.loc находятся 2 папки (www и src), т.е. если переходить по адресу http://myproject.loc, хоть с GET-запросом, хоть без, можно увидеть лишь 2 этих каталога, ведь index-файла там нет, он находится в папке www. Где я что-то упустил? Это важно, т.к. в следующем уроке возникают те же проблемы. (Windows, Open Server).
Привет. Нужно настроить OpenServer в соответствии с этим уроком - https://php.zone/php-training-course/3
Спасибо,теперь все работает. Проблема была в настройках OpenServer, в автопоиске доменов. Пользователь Tina в комментариях выше, возможно, тоже имела в виду что-то подобное, хоть у нее и не Openserver.
Я по началу вообще с denwer работал, ну потом перешёл на OpenServer. Так как в denwer обновлять версию PHP это муторное дело...
Вуаля, сработала! Тож смотрю, там только 2 папки и нет файла index.php. Настроил Openserver и норм.
Скажите пожалуйста, а почему мы используем
вместо
?
Потому что при обращении по несуществующему ключу напрямую будет возникать ошибка. Попробуй написать так, убрать поле из формы и отправить запрос.
Понял, спасибо.
Красава!
На рабочей машине(сервере) не работает use.
Что значит не работает?
после добавления данной строки
use MyProject\Models\Users\User;
http://autohit.pro/ страница не доступна, перекопировал все коды, все страниц, не пашит.
Давай текст ошибки
Спасибо за урок!
А разве не нужно у функций, которые ничего не возвращают (main(), sayHello()) ставить тип возвращаемого значения void? Уроками ранее на этом в комментариях делался сильный акцент.
Да, это можно делать, но не обязательно. Хотя является на данный момент хорошей практикой.
Можно было в index.php прописать
, чтобы писать при создании нового объекта
вместо
И с чего это index.php будет в этом нэймспейсе? Он вообще по другому пути валяется.
Да, написал не то, что хотел. Имелось в виду вот это:
а не namespace в начале класса, чтобы потом не писать длинное имя.
И всё же, он вообще в папке www лежит, а не в src\MyProject\Controllers\MainController
Так что, нельзя таким образом использовать инструкцию use, чтобы задать короткое имя для использованного в index.php класса? Хотя тут класс контроллера использован всего один раз в коде, может в этом и нет особого смысла, интересна сама возможность этого в принципе. Ну и код работает, никаких ошибок, предупреждений я ни в шторме, ни в браузере при запуске не видел. Все корректно работает.
Что работает понятно, просто есть стандарты, которые говорят о том, что путь неймспейса должен соответствовать файловой структуре проекта.
Так я же неймспейс вообще не пишу в индексе, а ссылаюсь на путь к классу контроллера с помощью use. Я же не пишу в индексе неймспейс для индекса.
Вот index.php:
Я не пойму, чем это отличается от вот этой ситуации:
Тут тоже используется use, чтобы не писать длинный путь к другому классу, который используется в данном. Use и namespace же не связаны тут. Namespace указывает на порстранство имен текущего класса, а use указывает на пространство имен другого использованного класса в текущем. Или я не прав?
Аа, сорян, я вас не понял) да, так конечно можно)
Я так понял, мы создали файл MainController и в нём создали класс - который является 'моделью', мы её описали, в дальнейшем мы передали в 'контролер', и уже с 'контролера' передали сформированный результат в 'представление'?
Если я конечно правильно понял.
В файле с контроллером создали модель? Что-то непохоже на правду :)
Я думал что класс 'Controller' и его описание это и есть модель (свойства и методы) :/
Можете подсказать пожалуйста что в данном контроллере послужило моделью?
Ничего. Контроллер это контроллер. До модели мы ещё не дошли.
Всё, теперь понял.
Почему в конце строки ставятся (), это ведь не метод, а класс. Без этих скобочек так же корректно работает. Или это некий стандарт записи?
Да, это стандарт PSR-12 https://www.php-fig.org/psr/psr-12/#4-classes-properties-and-methods
Благодарю за ссылку на стандарты
Ошибка, всё сделал как тут описано и смотрел в гитхабе (код такой же)
Переписал всё, теперь заработало, ничего не понял, но рад, что работает)
Ну видимо была опечатка в неймспейсе или имени класса
spl_autoload_register без str_replace)
Задача со звёздочкой, для тех кто юзает линукс)
В фрагменте кода :
require_once DIR . '/../src/' . $className . '.php';
нет замены :
str_replace('\', '/', $className)
Если вы на unix, то да, такая замена действительно нужна!
в index на сайте 3 строка
а на гите :
пока не залез на гит - ничего не работало. Правильно ли я понимаю что обычно сервера не используют unix и проблемы такой скорее всего не будет, и это просто частная ошибка из-за того что я на маке?
Обычно сервера используют unix, поправил урок, спасибо!