http://sandbox.onlinephpfunctions.com/code/c3aa4a84c0df4dd75c5ac6ec87f0fa8eb495e986 Ещё раз проверьте.
@NerdRage ты наверное меня не понял эта конструкция нужна для того чтобы поулчить конструктор класса родителя, при вызове просто наследуемого класса, при одном его вызове, это и однобно и правильно делать, если у тебянапример вызов подключения к бд идёт в конструкторе родителя, и этот вызов ты потом сохраняешь например в свойство класса родителя, а потом в методах наследуемого класса обращаешься к свойству родителя, то у тебя не найдёт твой вызов, к бд просто, если ты не пропишешь данную конструкцию.
Короче почитал я про пространства имён. И вообще не понял какой профит от таких конструкций. Ведь классы уже прекрасно справляются с инкапсуляцией, зачем поверх них городить ещё и пространства имён? Вот смотрите - как я делаю обычно: PHP: class Foo { function milkshake() { echo 'brings all the boys to the yard!'; } } $my = new Foo(); $my->milkshake(); Как предлагается делать с пространством имён: PHP: namespace Space { class Foo { function milkshake() { echo 'brings all the boys to the yard!'; } } } $my = new Space\Foo(); $my->milkshake(); Код стал длиньше, а профит от таких конструкций в чём? Инкапсуляция круче не стала. Файл всё-равно нужно подрубать через include или require, на сколько я понимаю. К тому же, встаёт вопрос - как городить конструкцию, которую мне тут посоветовали? Когда есть один главный класс, в котором идёт подключение к БД например, и есть куча дочерних классов, которые его расширяют, и тем самым автоматом подрубаются к БД.
Кстати, спрошу тут про подруб файлов заодно. Когда я городил свой индусский говнокод, меня изрядно задолбало, что стоит попытаться запустить что-то через крон - ничего не работает. Поэтому, при подключении файлов, я стал везде использовать абсолютные пути. Абсолютный путь я получаю очень наглым способом, это не совсем удобно, и совсем не красиво. Можно эту конструкцию написать лучше? Код (PHP): $TEMP = array(); $TEMP['plugin_dir'] = str_replace('\\', '/', dirname(__FILE__)).'/'; $TEMP['site_dir'] = str_replace('wp-content/plugins/myplugin/', '', $TEMP['plugin_dir']); require_once($TEMP['site_dir'].'wp-load.php'); require_once($TEMP['plugin_dir'].'functions.php'); unset($TEMP);
@NerdRage, профит от пространств имён в том, что они могут содержать классы с одним названием, которые не будут при этом конфликтовать между собой --- Добавлено --- Файл да, подрубать всё равно нужно. Но есть механизм автозагрузки, который эффективно работает вместе с неймспейсами, но может быть использован и без них.
А, ну ясно, мне такого не надо пока. Например, поиск в папке plugins и загрузка index.php из каждой субдиректории? Вообще, идея прикольная. Можно иметь главный неймспейс, где подрубается БД, а дочерние портянки подключать автоматом, при этом в каждом файле можно будет назвать классы одинаково, типа model {} view {} и controller {}. У меня ещё назрел вопрос, относится не к неймспейсам. Как мне вот здесь в классе B получить доступ к функции из класса A? Если переносить все такие необходимые функции в корневой класс G, то получится ппц огромная портянка. А если в классе B подрубать класс A, то __construct в классе G будет выполняться заново. Как-то не хотелось бы, чтобы у меня по 300 раз в коде происходил коннект к БД. PHP: class G { __construct() { // тут подрубаемся к БД и получаем необходимые переменные, типа сессии юзера } } class A extends G { function must_have() { echo 'без меня ничего не работает'; } } class B extends G { function shitty_func() { // как здесь получить доступ к функции must_have? } }
Ты про это? https://php.ru/manual/language.oop5.static.html Чот я зашёл, почитал и не совсем понял что значит "обращаться без создания экземпляра класса". Надо поэкспериментировать.
Самое забавное, что я целую систему кэширования писал, чтобы переменная сохранялась после первого обращения к методу, а потом сразу выплёвывалась при повторных обращениях.
Код (PHP): function get_stats($row, $till='', $cache=true) { // система кэширования if ($cache) { switch ($till) { case 'now': $cache_mode = 'now'; if ($this->stats[$row['id']]) { return $this->stats[$row['id']]; } break; case '': $cache_mode = 'full'; if ($this->stats_full[$row['id']]) { return $this->stats_full[$row['id']]; } break; default: $cache_mode = false; break; } } // DO STUFF $out = 'my stats'; if ($cache) { switch($cache_mode) { case 'now': $this->stats[$row['id']] = $out; break; case 'full': $this->stats_full[$row['id']] = $out; break; default: case false: // потом break; } } return $out; }
Я не знаю что такое адаптер кэша.) Мы в разделе "для новичков" всё-таки. Я хоть уже 7 лет кодю, но всё-равно делетант, потому что не ставил перед собой цели становиться программистом. Мне просто нужен был сайт и я начал фигачить, не зная об этом вообще ничего.) --- Добавлено --- Раз тут пошла такая пьянка, спрошу заодно про HTML. Как лучше отделять от PHP? Может какой-то шаблонизатор посоветуете? А то у меня сейчас везде в коде сделано по простому - HTML встроен прямо в PHP. PHP: foreach ($rows as $out) { $content .= ' <tr class="'.$class.'"'.$title.'> <td>'.$this->get_time($out['date'], 'compact', false).'</td> <td>'.$out['day'].' дн.</td> <td>'.$out['goal'].'</td> <td>'.$out['details'].'</td> </tr>'; } $content = ' <div id="more-stats"> <h3>Расчет статистики по дням:</h3> <table> <thead> <td>Дата</td> <td>День</td> <td>Цель</td> <td>Детализация</td> </thead> <tbody> '.$content.' </tbody> </table> <ul class="tip-wrap"> <li><span class="centered bord-weekend">а</span> - выходной день.</li> <li><span class="centered bord-extra-day">а</span> - дополнительный день.</li> <li><span class="centered bord-today">а</span> - сегодня.</li> </ul> <div class="clear"></div> </div> ';
Если ты собираешь код страницы в переменную, а выводишь только в самом конце, то можно в коде использовать редирект через header('location:'). Если сразу выплёвывать HTML, то будет писать "headers already sent". Я когда только начинал кодить столкнулся с этим, в итоге привык выводить всё через пременную.
Так всё по-другому делается. Сначала код собирает все данные, потом передаёт их в шаблон, который уже написан на смеси php и html, но там нету кода, который отвечает за что-то, кроме вывода инфы. Плюс буферизация вывода - ну тут кучу раз это обсуждали
Я тут немножко писатор, а не немножко читатор. Но про буфер вывода нагуглил, спасибо, прикольная фича.