За последние 24 часа нас посетил 17601 программист и 1720 роботов. Сейчас ищут 1863 программиста ...

Как передалать мой код?

Тема в разделе "PHP для новичков", создана пользователем NerdRage, 6 июл 2016.

  1. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @NerdRage ты наверное меня не понял эта конструкция нужна для того чтобы поулчить конструктор класса родителя, при вызове просто наследуемого класса, при одном его вызове, это и однобно и правильно делать, если у тебянапример вызов подключения к бд идёт в конструкторе родителя, и этот вызов ты потом сохраняешь например в свойство класса родителя, а потом в методах наследуемого класса обращаешься к свойству родителя, то у тебя не найдёт твой вызов, к бд просто, если ты не пропишешь данную конструкцию.
     
  3. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Короче почитал я про пространства имён. И вообще не понял какой профит от таких конструкций. Ведь классы уже прекрасно справляются с инкапсуляцией, зачем поверх них городить ещё и пространства имён? Вот смотрите - как я делаю обычно:
    PHP:
    1. class Foo {
    2.     function milkshake() {
    3.         echo 'brings all the boys to the yard!';
    4.     }
    5. }
    6. $my = new Foo();
    7. $my->milkshake();
    Как предлагается делать с пространством имён:
    PHP:
    1. namespace Space {
    2.     class Foo {
    3.         function milkshake() {
    4.             echo 'brings all the boys to the yard!';
    5.         }
    6.     }
    7. }
    8. $my = new Space\Foo();
    9. $my->milkshake();
    Код стал длиньше, а профит от таких конструкций в чём? Инкапсуляция круче не стала. Файл всё-равно нужно подрубать через include или require, на сколько я понимаю. К тому же, встаёт вопрос - как городить конструкцию, которую мне тут посоветовали? Когда есть один главный класс, в котором идёт подключение к БД например, и есть куча дочерних классов, которые его расширяют, и тем самым автоматом подрубаются к БД.
     
    #53 NerdRage, 24 июл 2016
    Последнее редактирование: 24 июл 2016
  4. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Кстати, спрошу тут про подруб файлов заодно. Когда я городил свой индусский говнокод, меня изрядно задолбало, что стоит попытаться запустить что-то через крон - ничего не работает. Поэтому, при подключении файлов, я стал везде использовать абсолютные пути. Абсолютный путь я получаю очень наглым способом, это не совсем удобно, и совсем не красиво. Можно эту конструкцию написать лучше?
    Код (PHP):
    1. $TEMP = array();
    2. $TEMP['plugin_dir'] = str_replace('\\', '/', dirname(__FILE__)).'/';
    3. $TEMP['site_dir'] = str_replace('wp-content/plugins/myplugin/', '', $TEMP['plugin_dir']);
    4.  
    5. require_once($TEMP['site_dir'].'wp-load.php');
    6. require_once($TEMP['plugin_dir'].'functions.php');
    7. unset($TEMP);
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @NerdRage, ты где читал про namespace?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @NerdRage, профит от пространств имён в том, что они могут содержать классы с одним названием, которые не будут при этом конфликтовать между собой
    --- Добавлено ---
    Файл да, подрубать всё равно нужно. Но есть механизм автозагрузки, который эффективно работает вместе с неймспейсами, но может быть использован и без них.
     
    pinokio и denis01 нравится это.
  7. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    А, ну ясно, мне такого не надо пока.
    Например, поиск в папке plugins и загрузка index.php из каждой субдиректории? Вообще, идея прикольная. Можно иметь главный неймспейс, где подрубается БД, а дочерние портянки подключать автоматом, при этом в каждом файле можно будет назвать классы одинаково, типа model {} view {} и controller {}.

    У меня ещё назрел вопрос, относится не к неймспейсам. Как мне вот здесь в классе B получить доступ к функции из класса A? Если переносить все такие необходимые функции в корневой класс G, то получится ппц огромная портянка. А если в классе B подрубать класс A, то __construct в классе G будет выполняться заново. Как-то не хотелось бы, чтобы у меня по 300 раз в коде происходил коннект к БД.

    PHP:
    1. class G {
    2.     __construct() {
    3.         // тут подрубаемся к БД и получаем необходимые переменные, типа сессии юзера
    4.     }
    5. }
    6.  
    7. class A extends G {
    8.     function must_have() {
    9.         echo 'без меня ничего не работает';
    10.     }
    11. }
    12.  
    13. class B extends G {
    14.     function shitty_func() {
    15.         // как здесь получить доступ к функции must_have?
    16.     }
    17. }
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    статику попробуй использовать вместо объектов
     
  9. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Ты про это? https://php.ru/manual/language.oop5.static.html
    Чот я зашёл, почитал и не совсем понял что значит "обращаться без создания экземпляра класса". Надо поэкспериментировать.
     
    #59 NerdRage, 25 июл 2016
    Последнее редактирование: 25 июл 2016
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Да, про это. Экспериментируй.
     
  11. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Начал читать тут про статик-переменные и припух.

    [​IMG]
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Прякинь.
     
  13. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Самое забавное, что я целую систему кэширования писал, чтобы переменная сохранялась после первого обращения к методу, а потом сразу выплёвывалась при повторных обращениях. :D
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Показывай, заценим.
     
    denis01 нравится это.
  15. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Код (PHP):
    1. function get_stats($row, $till='', $cache=true) {
    2.  
    3.     // система кэширования
    4.     if ($cache) {
    5.         switch ($till) {
    6.             case 'now':
    7.                 $cache_mode = 'now';
    8.                 if ($this->stats[$row['id']]) {
    9.                     return $this->stats[$row['id']];
    10.                 }
    11.                 break;
    12.             case '':
    13.                 $cache_mode = 'full';
    14.                 if ($this->stats_full[$row['id']]) {
    15.                     return $this->stats_full[$row['id']];
    16.                 }
    17.                 break;
    18.             default:
    19.                 $cache_mode = false;
    20.                 break;
    21.         }
    22.     }
    23.  
    24.     // DO STUFF
    25.     $out = 'my stats';
    26.  
    27.     if ($cache) {
    28.         switch($cache_mode) {
    29.             case 'now':
    30.                 $this->stats[$row['id']] = $out;
    31.                 break;
    32.  
    33.             case 'full':
    34.                 $this->stats_full[$row['id']] = $out;
    35.                 break;
    36.  
    37.             default:
    38.             case false:
    39.                 // потом
    40.                 break;
    41.         }
    42.     }
    43.     return $out;
    44. }
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Я ожидал нормальный адаптер кэша. А тут условное кэширование конкретно взятых сущностей.
     
  17. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Я не знаю что такое адаптер кэша.) Мы в разделе "для новичков" всё-таки. Я хоть уже 7 лет кодю, но всё-равно делетант, потому что не ставил перед собой цели становиться программистом. Мне просто нужен был сайт и я начал фигачить, не зная об этом вообще ничего.)
    --- Добавлено ---
    Раз тут пошла такая пьянка, спрошу заодно про HTML. Как лучше отделять от PHP? Может какой-то шаблонизатор посоветуете? А то у меня сейчас везде в коде сделано по простому - HTML встроен прямо в PHP.

    PHP:
    1. foreach ($rows as $out) {
    2.     $content .= '
    3.            <tr class="'.$class.'"'.$title.'>
    4.                <td>'.$this->get_time($out['date'], 'compact', false).'</td>
    5.                <td>'.$out['day'].'&nbsp;дн.</td>
    6.                <td>'.$out['goal'].'</td>
    7.                <td>'.$out['details'].'</td>
    8.            </tr>';
    9. }
    10.  
    11. $content = '
    12.        <div id="more-stats">
    13.            <h3>Расчет статистики по дням:</h3>
    14.            <table>
    15.                <thead>
    16.                    <td>Дата</td>
    17.                    <td>День</td>
    18.                    <td>Цель</td>
    19.                    <td>Детализация</td>
    20.                </thead>
    21.                <tbody>
    22.                    '.$content.'
    23.                </tbody>
    24.            </table>
    25.            <ul class="tip-wrap">
    26.                <li><span class="centered bord-weekend">а</span> - выходной день.</li>
    27.                <li><span class="centered bord-extra-day">а</span> - дополнительный день.</li>
    28.                <li><span class="centered bord-today">а</span> - сегодня.</li>
    29.            </ul>
    30.            <div class="clear"></div>
    31.        </div>
    32.        ';
     
  18. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Лучший шаблонизатор для пхп - пхп сам по себе.
     
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    https://secure.php.net/manual/ru/language.basic-syntax.phpmode.php
     
  20. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Ну хз, по-моему проще HTML встраивать в PHP, чем PHP в HTML. Хотя, дело вкуса наверно.
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Что удобного вы видите в бесконечных строковых константах?
     
  22. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @NerdRage, верстальщик 100 раз тебя "вспомнит" пока будет разбираться с твоим кодом.
     
  23. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Если ты собираешь код страницы в переменную, а выводишь только в самом конце, то можно в коде использовать редирект через header('location:'). Если сразу выплёвывать HTML, то будет писать "headers already sent". Я когда только начинал кодить столкнулся с этим, в итоге привык выводить всё через пременную.
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Так всё по-другому делается. Сначала код собирает все данные, потом передаёт их в шаблон, который уже написан на смеси php и html, но там нету кода, который отвечает за что-то, кроме вывода инфы. Плюс буферизация вывода - ну тут кучу раз это обсуждали
     
  25. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Я тут немножко писатор, а не немножко читатор. Но про буфер вывода нагуглил, спасибо, прикольная фича.