Интересные возможности языка PHP

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

    Содержание статьи имеет мало общего с моей прошлой статьей про использование выражений в PHP. Речь не идет об усложнении кода, скорее наоборот.


    Команда BREAK.


    Многие почему-то считают, что break может использоваться исключительно в конструкциях switch. Это заблуждение. Кроме switch, она используется в циклах. Кроме того, у команды есть необязательный параметр – число уровней, из которых надо выйти. Например:

    while ($exp1) {
        while($exp2) {
            if ($exp3) {
                // полный выход из цикла
                break 2;
            }
            else {
                // выход только из while($exp2)
                break;
            }		
        }
    }


    Команда CONTINUE


    Как и break имеет параметр – число уровней возврата к циклу.

    while ($exp1) {
        while($exp2) {
            if ($exp3) {
                // возврат к while ($exp1)
                continue 2;
            }
            else {
                // возврат к while ($exp2)
                continue;
            }		
        }
    }

    Кстати, в конструкции switch команда continue дает точно такой же эффект, что и break. Поэтому, если у вас внутри цикла находится оператор switch, и вы внутри него попытаетесь выполнить continue, то у вас произойдет просто break из свича, а не возврат к началу цикла. В этом случае для получение ожидаемого нужно сделать continue 2;

    Команда include


    А вы знаете, что include скрипта работает точно так же, как вызов функции, а именно может возвращать значения, отдаваемые командой return в процессе выполнения этого скрипта? То есть можно сделать так:

    // файл i.php
    Return “hello, world!”
    
    // файл index.php
    // напечатает “hello, world!”
    echo include (“i.php”);

    Конечно, это касается остальных подобных команд (include_once, require, require_once).

    Цикл for


    О том, что в for в первом и третьем параметре можно перечислять выражения, я уже говорил в статье использовании выражений в PHP. Там и пример есть.

    Оператор ${}.


    Оператор ${} рассматривается как переменная, имя которой определено как строка, получаемая из выражения в фигурных скобках. Это очень сильно может облегчить жизнь при работе со свойствами и методами классов в ООП. Например:

    $myClass = new stdClass();
    $myClass->myParam  = new stdClass();
    	
    function calcThis ($method) {
        return "my".$method;
    }
    
    // Вы не можете так сделать, так как у вас это будет рассмотрено как метод класса:	
    $myClass->calcThis('Param')->c = 3;
    
    // Но вы можете это сделать так:
    $myClass->{calcThis('Param')}->c = 3;
    

    В этом примере нет знака $, потому что при обращении к методу или свойству класса он не требуется.

    Команда DECLARE


    Заслуженно можно сказать, что это самая редкоиспользуемая базовая конструкция в PHP. Она нужна для установки директив интерпретатору при выполнении кода. На данный момент существует только одна директива – ticks.

    Declare (ticks=n) – говорит интерпретатору (создает событие), что ему нужно что-то обработать через каждые n тиков. Тик – это выполнение одного базового действия php. Кроме этого, с помощью специальной функции register_tick_function() установить функцию, которая будет выполнена при возникновении события, иначе конструкция бессмысленна.

    На практике declare можно использовать для профайлинга скриптов. Т.е. благодаря тикам можно замерять время, потраченное на выполнение каждой вашей операции (или их группы) в скрипте.

    Как это делается смотрите тут — http://www.php.net/manual/ru/control-structures.declare.php

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 174

    • UFO just landed and posted this here
        +1
        Иногда доходит. Мне доводилось использовать ->{}
          0
          ну про for и {} вообще много где есть и мне часто доводилось использовать.
          {} я использовал правда не в классах, а чаще для переменных, а вот по поводу for — тут совсем частый пример есть:
          for($count=count($res), $i=0; $i < $count; $i++) { ... }
      • UFO just landed and posted this here
          +22
          Избегать switch не стоит, на мой взгляд. Иногда по логике приложения, оператор switch подходит куда более конструкций if… else
          • UFO just landed and posted this here
            • UFO just landed and posted this here
                –4
                Всё, понятно. Мой коментарий ниже утратил актуальность.
                  0
                  Спасибо за ссылку. Интересно было бы оформить такой скрипт, который выполнял бы тесты для конкретного пхп, к примеру последнего. Ведь все может изменится, и старые конструкции foreach к примеру, оптимизированы по скорости выполнения. К сожалению сейчас пхп редко использую, может быть дома для себя и накатаю :) А может быть кто-то подскажет линк на что-то подобное, уже реализованное — буду благодарен :)
                  0
                  Так, а вот это уже интересно. Я немного не понял — что в 2 раза бытрее? switch? Тогда какие же причины его не использования?

                  Если вы про if/esle (предположу, что вы просто неправильно написали), то все равно хотелось бы узнать поподробнее. Можете дать источник, где это написано?
                    0
                    хоть if хоть switch в итоге на низком уровне приводится к конструкции «если тру тогда иначе отхер», так что имхо по скорости все одно…
                      0
                      В php — скорее всего. А вообще-то почти все компиляторы генерируют совершенно разный код для if и switch (case в delphi).
                        0
                        Компиляторы бывают достаточно умны, чтобы выбрать оптимальный вариант: цепочку условных переходов, вычисляемое goto, вплоть до хэш-таблицы (последнее использует компилятор C# в switch по строкам).
                    –15
                    Полностью подерживаю, чем городить конструцию из if elseif(иногда в elseif происходит путаница) else.
                    Для меня проще использовать switch, выглядит более читабельно.

                    И еще бы в php было бы GoTO как было в VB, а то иногда его ОХ как не хватает (:
                      +9
                      В php6 будет. Только вообще использование goto считается дурным тоном.
                        –2
                        настоящие программисты не боятся использовать GOTO
                          0
                          Да уж, goto — издержки отсутствия других современных механизмов и может быть использовано чисто функционального программирования (ну или в соответствующих языках). Для ООП это крайне неудобная штука, так как определяет точку обращения по номеру строки, а не условному идентификатору (имени класса, метода, процедуры), а при этом, номер строки — часто изменяемая вещь.
                            +3
                            Сочитание goto и ООП я вообще вообразить не могу. Жду php6, там видно будет. Но вообще goto только в бейсике и то в его ранних версиях привязывали к номеру строки. Позже использовались метки. в php6 так же будет.
                              0
                              Согласен. Просто я с «goto» сталкивался в то время, когда меток еще и не было.
                              Но то, что в концепции ООП не может быть и меток то никаких — это однозначно, иначе, даже если это технически и возможно, рушится сама концепция ООП, в частности основополагающий принцип инкапсуляции.
                                +1
                                Каша какая-то… А оператор выбора (switch) ООП не противоречит? Как организация потока управления в обособленном методе может противоречить принципам организации программы на более высоком уровне — то есть ООП. Мы же не говорим, надеюсь, о спагетти-коде как парадигме — времена Фортран-IV вроде прошли. goto противоречит принципам структурного программирования, а ООП скорее ортогонален.
                                У меня такое впечатление, что «ООП» и «хороший стиль программирования» стали у многих взаимозаменяемыми понятиями.
                                  0
                                  Ну почему же каша. Оператор выбора switch не противоречит принципу инкапсуляции, так как действует в своей «области видимости» (scope) и не может нарушить последовательность выполнения цикла внутри метода (и вообще в любом своем контексте), в то время как goto — может, на что он, собственно и рассчитан — иначе просто нет смысла в нем.

                                  Однако, я в своей мысли ни в коем случае не отождествляю «ООП» и «хороший стиль» — можно написать как прекрасный, так и жутко неудобоваримый как ООП-код, так и функциональный.

                                  goto противоречит принципам структурного программирования — как один из фактов. В том числе. Тут совершенно согласен.
                                    +1
                                    Уже сейчас в php можно сделать много чего такого, что сложно назвать и структурным, и объкетно-орентированным програмированием. Не знаю, будет ли такое работать с других языках:

                                    class A {function __construct(){ echo «A»;}}
                                    class B {function __construct(){ echo «B»;}}

                                    $expression = 1 or 2; // Now, it's true == 1

                                    switch ($expression)
                                    {
                                    case 1: class C extends A{}; break;
                                    case 2: class C extends B{}; break;
                                    }

                                    $my = new C();

                                    Для консерваторов конечно это страшнейший код, о котором никто не должен знать (Т-с-с!). Но я нахожу в нём свою красоту :-)

                                    А представьте, еще goto будет? И нэймспейсы? Это я к тому, что ООП и хороший стиль — это кислое с длинным. Да и само понятие «хороший стиль» тоже весьма расплывчато. Для многих вон использование break уже плохой стиль…
                                      0
                                      Динамическое порождение классов не вписывается в ООП? Ну-ну :-)
                                        0
                                        В писывается, но как мне кажется в моем примере — откровенный хак. :-)
                                          0
                                          Здесь — возможно, но вообще — это нормальная штука.
                                        0
                                        А чем неймспейсы не угодили?) Мы их используем в C# (и packages в ActionScript) вовсю и очень рады, что они есть!
                                        На самом деле, для консерваторов динамическая типизация — уже нечто ужасное. Так что примеров много.
                                        А по поводу «ООП» и «хороший стиль» я свою мысль уже написал в предыдущем комментарии. С тех пор взгляд пока не изменился :)
                                        +1
                                        Я всё же не могу отождествить инкапсуляцию как принцип ООП и, хм, локальность в потоке управления. Тем более goto действует в пределах функции или метода, это же не call/cc… Ограниченная видимость переменных в пределах операторного блока — это что, тоже инкапсуляция?
                                          0
                                          А, нет, возможно тут вы правы, не поинтересовался scope'ом самих операторов goto.
                                          Однако тогда какой вообще толк в goto?
                                            0
                                            Да никакого, в общем-то.
                                            В языках без многоуровневого break можно, крепко зажмурившись, применить для выхода из глубоко вложенных циклов.
                                            Бывает полезно для автоматически генерируемого кода, например, синтаксических анализаторов.
                                  0
                                  Даже в Pascal сделано goto по привязке к lable, а не к номеру строки, неужели в php не додумаются?!
                              • UFO just landed and posted this here
                                  0
                                  помнится, даже в Паскале, в официально документации, было написано: функция goto, делает что-то-там, использовать только при отладке, не использовать в конечных программах.
                                  И в других языках аналогично.
                                  • UFO just landed and posted this here
                                      +3
                                      Потому, что Бейсик так устроен. Но только Бейсик.
                                        0
                                        Нам и сейчас на примере C++ про goto рассказывают.
                                          +1
                                          За то нам на информатике сказали если используете goto сразу не зачет :)
                                      +6
                                      зато сам код PHP девственно чист от этого:

                                      ~/tmp/php-5.3.0alpha1 $ grep -ir " goto " * | grep -v '*' | wc -l
                                      16369
                                      
                                      • UFO just landed and posted this here
                                    • UFO just landed and posted this here
                                        –4
                                        ойблин, название помню, что делала — уже не вспомню (
                                          0
                                          Вызов подпрограммы :) Когда младшей сестре в школе начали QB вдалбливать, и не такое пришлось вспомнить :-D
                                            –4
                                            у нас в Севастополе собирали компьютеры Парус, наподобии Коммодора что-то, так вот там все что было — это бейсик =) помню игры загружали load, маленький был очень, и не помню всего. Да и тогда мало что понимал, тупо с книжки переписывал )
                                            Эх, ностальгия =)
                                      0
                                      Проблема со switch в php в том, что он сравнивает в кейсах, не учитывая типы, т.е. не ===, а ==

                                      чем это грозит:

                                      $test = true;

                                      switch($test) {
                                      case 1:
                                      echo '1';
                                      break;
                                      case 2:
                                      echo '2';
                                      break;
                                      }

                                      Выведется — 1
                                        +1
                                        Обычно '==' используется чаще '==='. Прблему можно обойти, но не слишком удобным способом:

                                        $test = true;

                                        switch(true)
                                        {
                                        case $test === 1:
                                        echo '1';
                                        break;
                                        case $test === 2:
                                        echo '2';
                                        break;
                                        }

                                        Нифига не выведится.
                                          0
                                          мм… а должно быть скока? Если true = 1 всегда.
                                            0
                                            даже если в первом case будет 10 или 999, то все равно проверка == даст true
                                            0
                                            мм… а должно быть скока? Если true = 1 всегда.
                                            0
                                            Мне вот интересно, паттерны, заменяющие свитчи и «тяжелые» условные операторы нынче непопулярны, да?
                                            • UFO just landed and posted this here
                                              0
                                              Не, тогда уж RTTI-based способы ещё более логичны :)
                                              –22
                                              А break и continue вообще считается плохой практикой программирования и эти два оператора следует использовать лишь в крайних случаях.
                                                0
                                                Почему, и что за крайние случаи?
                                                  –4
                                                  Потому что резко ухудшается читабельность кода и если через какое-то время попытаться понять, что делает кусок кода, в котором есть break или continue — сделать это непросто(особенно если код писал другой человек).
                                                  Я за свою довольно долгую практику не встречал ни одного случая когда break или continue были необходимы, всегда можно переписать код без них, хотя он и может стать немного объемнее, но и гораздо понятнее.
                                                  Мне приходилось использовать эти два оператора только во время отладки, когда, например, нужно вывести какой-то массив данных и прервать выполнение большого цикла.
                                                    +3
                                                    Научно доказано, что любой алгоритм можно реализвать только с помщью оператора if и цикла while. Может, только ими пользоваться? Код вполне станет «немного объемнее, но и гораздо понятнее».
                                                      +2
                                                      Вряд ли станет гораздо понятнее. Кроме того, той же наукой доказано, что любую программу можно реализовать средствами железа. Почему бы не делать так? Вот познакомьтесь, эта микросхемка реализует веб сервер с одноклассниками (: А на сколько шустрее все будет на ней бегать… Единственная проблема это дальнейшее развитие и отладка немного затруднены (:
                                                        0
                                                        вы наверно хотели сказать «с помщью оператора if или цикла while»?
                                                          –1
                                                          Нет. Я сказал, то что хотел сказать. Обязательно нужен оператор условия и оператор цикла. Как вы одним if-ом реализуйте цикл?
                                                            +7
                                                            Рекурсивно

                                                            function opa($i) { $i++; if($i != 10){ echo $i; opa($i); } } opa(1);
                                                            • UFO just landed and posted this here
                                                                0
                                                                Выше ссылались на формальную теорему, что любой поток управления можно представить с помощью последовательного выполнения, условного выполнения и цикла, и только их. Рекурсия — это уже другая модель вычислений, впрочем, эквивалентной мощности.
                                                              0
                                                              Про то, как с помощью одного while обойтись без if написать?
                                                                –7
                                                                1 000 000 проходов цикла это выдержит, как считаете?
                                                                  0
                                                                  Уточните вопрос, пожалуйста.
                                                                    –7
                                                                    Вот так это будет работать?

                                                                    function opa($i) { $i++; if($i != 10000000){ echo $i; opa($i); } } opa(1);
                                                                      0
                                                                      да
                                                                        –2
                                                                        А стек возврата не переполнится?
                                                                          +2
                                                                          Мне все равно. Моя задача была доказать, что любой алгоритм можно реализовать с помощью оператора if или оператора while.
                                                                            –2
                                                                            Ну как же так? Т.е. алгоритм мы реализовать можем, только вот работать он не будет… :-)

                                                                            Ну хорошо, я согласен — теоретически вы вполне обосновали вашу точку зрения.
                                                                            +2
                                                                            В нормальных языках — не переполнится, потому что это хвостовая рекурсия, т.е. фактически, цикл. ;-)
                                                            +1
                                                            В таком случае прийдется например вместо for писать while і писать лишнее условие в цыкл. Очень сомниваюсь что это понятнее чем обычный if в теле цыкла с условием.
                                                            В случае с break и contunue получается своего рода «прерывание»… а именно так оно реализовано на низком уровне (все процедуры, функции и т.п.). Для того чтобы понять проблему мы всегда разбираем ее суть, ИМХО для написания хорошего програмного кода необходимо понимать как он исполняется :)
                                                              –1
                                                              Значит конструкция

                                                              foreach( scandir($dir) as $row )
                                                              {
                                                              if( $row == '.' or $row == '..') continue;
                                                              if( $row == $myfile )
                                                              {
                                                              print 'YES!';
                                                              break;
                                                              }
                                                              }
                                                              ужасно плохо читается?
                                                              Бред.
                                                                0
                                                                Это то о чем я говорил :)
                                                                  0
                                                                  А зачем строка с «continue»? Типа оптимизируете?
                                                                  • UFO just landed and posted this here
                                                                    +3
                                                                    очень интересно. как вы обходитесь без break в случае поиска элемента в массиве? вы просматриваете всегда весь массив? как по мне нужно остановить цикл если элемент найден.
                                                                      +1
                                                                      А что разве нет встроенных функций для поиска элементов массива? O_o
                                                                        0
                                                                        массивы то бывают разные. ps: это был просто пример. поиск может быть не только по массиву.
                                                                          0
                                                                          Они не работают с итераторами
                                                                          –10
                                                                          for($i=0;$i<$count && $notfind;$i++)…

                                                                          или

                                                                          do {...} while ($found)

                                                                          кажется, это азбука алгоритмизации. кроме как в случае крайней запарки и работы с чужим кодом, не впишу break в цикл. нафик-нафик
                                                                            +3
                                                                            Может это только мои заморочки, но данный цикл будет работать медленее, т.к. при каждой итерации будет выполняться дополнительная проверка. Да и плюс лишняя переменная.
                                                                            • UFO just landed and posted this here
                                                                                0
                                                                                А у вас в таком случае сразу 3. NotFind же не автоматом выставляется.

                                                                                [code]for($i=0;$i<$count && $notfind;$i++) {if (...) notfind=false}[/code]
                                                                                • UFO just landed and posted this here
                                                                          • UFO just landed and posted this here
                                                                            0
                                                                            Вы путаете с goto
                                                                          +3
                                                                          Поддерживаю. А за использование операторов break N и continue N, где N > 1 я бы больно стучал.
                                                                            +5
                                                                            Правда? Кто сказал? Я думал goto плохо а break и continue его заменяет… В пхп нету goto так надо обругать break и continue?
                                                                              +2
                                                                              Вот я тоже так думаю. continue и break еще в С появились, и их там никто не ругал, в отличие от goto в Бейсике.

                                                                              Про goto я много слышал плохого, и даже это плохое испытал на собственной шкуре. Но про continue и break — слышу негатив впервые.
                                                                              +12
                                                                              Это очень устаревший взгляд. Операторы break и continue считались «плохими» в 60-70 годах, поскольку они противоречили правилу структурного программирования об одной точке выхода из метода. В те времена в коде господствовали огромные функции и разобраться в них было сложно, особенно если у них было несколько точек выхода. В те времена это был хороший совет.

                                                                              Сейчас высокоуровневый код изменился, господствует концепция Composed method, и соотвественно все функции небольшие. В таких условиях break и continue только улучшают код, поскольку помогают выделить особые граничные условия, облегчая чтение основного алгоритма. Без них проверка граничных условий пораждает кучу вложенных блоков, и код становится совсем некрасивым.
                                                                                0
                                                                                Спасибо, буду иметь ввиду. А не подскажите ссылку, где можно почитать про Composed method, или лучшее решение — гуглить? :)
                                                                                  +2
                                                                                  Да тут особенно не о чем читать :). Просто мне нравится термин. Его предложил Кент бек в своей книжки про лучшие практики в Smalltalk.

                                                                                  Это простой и короткий метод, состоящий из нескольких простых шагов (вызовы других методов или системных функций, простые циклы), находящихся на одном уровне детализации (то есть если метод начинается с вызова понятно названных функций, а потом вдруг появляется страшный цикл работающий с битами, то это неправильно, для него нужна отдельная функция).
                                                                                  В общем, смысл в том, что такой метод должен читаться легко и приятно, как книжка (потому что он короткий и состоит из вызовов других функций с понятными именами). Взглянув на него сразу должна быть понятна его логика работы. А все сложные моменты реализации должны быть в других функциях.
                                                                                    0
                                                                                    Ага, а помимо этого — хорошо тестируемый. Только по набору тестов можно было понять, что делает метод. Кент Бек — одна из известных фигур в Agile в целом и unit-тестировании в частности.
                                                                                    Вообще, изучение принципов Test-Driven Development дает много ответов на то, как писать красивый и функциональный код без ненужных излишеств.
                                                                                0
                                                                                Вы перепутали break/continue с goto. Вот goto следует избегать. А break/continue как раз и придумали на замену goto.
                                                                                +1
                                                                                По ссылке про declare интересная информация про отладку скрипта. В частности, в комментариях к функции приводится пример, как можно проанализировать время выполнения каждой функции.

                                                                                У кого-нибудь реализован класс с хорошей функциональностью для этих целей?
                                                                                  +1
                                                                                  ну не свсем клас, но:

                                                                                  function profile ($dump = FALSE)
                                                                                  {
                                                                                  static $profile;
                                                                                  // Возвращается время, хранимое в профиле, затем удаляется
                                                                                  if ($dump) {
                                                                                  $temp = $profile;
                                                                                  unset ($profile);
                                                                                  return ($temp);
                                                                                  }
                                                                                  $profile[] = microtime ();
                                                                                  }

                                                                                  //как использовать:
                                                                                  //register_tick_function(«profile»);
                                                                                  //profile ();
                                                                                  //bla bla bla — ваш код
                                                                                  //print_r (profile (TRUE));
                                                                                    +1
                                                                                    А просто профайлер нельзя использовать?
                                                                                      +6
                                                                                        0
                                                                                        Спасибо, весьма полезно.
                                                                                      +1
                                                                                      Возвращаемые значения в инклудах удобно для отладки, еще на перле была такая практика — в конце файла ставишь что-нить типа return true; Потом проверяешь его — сразу видно где эрорра засела.
                                                                                        –1
                                                                                        Блин я в шоке, такое публикова, первый пункт применения брейка вообще нормалного человека повалит с ног. Брейк и так всегда и во всех языках создавался именно для цикло, там же и применялся, а в данной статье автор почему-то думает люди используют его в свиче, а о применении в циклах не знают. Писец поный, а не статья. И вообще бредовы практически все пункты, среди них про include(вывода автора — чушь и только запутают неопытного пользователя(такого же как видимо и сам автор:))),
                                                                                        ${} — не оператор, а просто тут есть скобки:)

                                                                                        Автору: не стоит больше писать такого на серьёзных ресурса, либо сразу помещайте статьи в раздел «Юмор»
                                                                                          0
                                                                                          А чего минусуем если ни секрет, у автора много друзей ничего не понимающих в PHP, ну а если с чем-то не согласны, тоуж пишите пожалуйста.
                                                                                            –1
                                                                                              0
                                                                                              Это где же ты увидел оскарбления на свой счет, а критику воспринимать тебя никто не учил видимо. Жалко мне таких людей.
                                                                                              P.s.: в статье нужно оставить только последний пункт, ибо остальное либо не соответствует истине, либо просто детский лепет.
                                                                                              +3
                                                                                              Может проблема не в смысле вашего поста, а в манере подачи?
                                                                                                –2
                                                                                                Да нет судя по минусам автора статьи других мои комментариев, дело не в способе подачи, а в том что с ним не согласны. А за пропущенные буквы в первом моем комментарие — извиняюсь, торопился:)
                                                                                                  +2
                                                                                                  Да дело даже не в орфографии и пунктуации. «Мягче надо быть, мягче» (с) какая-то реклама.
                                                                                                    0
                                                                                                    А чего мягче, это мое отношение к абсолютно бесполезной, с неправильными выводами статье, кроме того, я никого не оскорблял.
                                                                                                  0
                                                                                                  А чего такого в «манере подачи»? Абсолютно по делу коментарий.

                                                                                                  «Знаете ли вы, для чего нужен брейк? В РНР, оказывается, есть такая неожианная возможность...». плАчу…

                                                                                                  Пример исспользования include вообще разит наповал. Автор статьи занимается форменным вредительством: тем, кому в голову не приходило подобное исспользование — им оно и не надо, а те, кто догадался — понимают, почему этого делать нельзя никогда.

                                                                                                  «Оператор ${}.» — это вообще цирк. И что же это за оператор такой? Унарный? Логический?
                                                                                                  И это в статье «о программировании»…
                                                                                                    –9
                                                                                                    Во-первых вы тут не один. Во-вторых, вы все знаете — хорошо, но кричать что статья плохая только потому написано то, что вы уже знаете — признак школьного возраста. В-третьих давайте вы не будете решать, за других — что кому надо — это не в вашей компетенции. В-четвертых что это за оператор такой, русским языком написано в статье. Прочитайте, пожалуйста, внимательно.

                                                                                                    Это же все относится к serega011.
                                                                                                      0
                                                                                                      >Во-вторых, вы все знаете — хорошо, но кричать что статья плохая только потому написано то, что вы уже знаете — признак школьного возраста
                                                                                                      При чём тут я? В принципе, это любой человек, занимающийся программированием должен знать.

                                                                                                      > В-третьих давайте вы не будете решать, за других — что кому надо — это не в вашей компетенции.
                                                                                                      А в чьей? В вашей? lol!

                                                                                                      >В-четвертых что это за оператор такой, русским языком написано в статье.
                                                                                                      Угу, именно это я и имел в виду. Вы, вообще, знаете, что такое «оператор»?
                                                                                                      Привелите, пожалуйста, пункт спецификации РНР, где рассказывается об этом операторе.
                                                                                                      Спасибо.
                                                                                                        0
                                                                                                        > В принципе, это любой человек, занимающийся программированием должен знать.

                                                                                                        Про любой учебник и пр. по PHP (и не только) можно сказать — а нафиг он нужен, если в мануалах все есть? Курите маны, господа! :-)

                                                                                                        Любой человек, занимающийся програмированием, должен сперва откуда-то об этом узнать.

                                                                                                        > А в чьей? В вашей?
                                                                                                        Не в моей. Но я ж даю утврждений типа «так, вот для тех это нужно, а для тех не нужно».

                                                                                                        > Вы, вообще, знаете, что такое «оператор»?

                                                                                                        Инструкция или Оператор (англ. statement) — наименьшая автономная часть языка программирования; команда. — ru.wikipedia.org/wiki/Оператор_(программирование). Ну и?

                                                                                                        Ладно, если это не оператор, что что это по вашему? Скобка? Скобка — это не оператор?

                                                                                                        В манах по PHP я не нашел описание этой возможности, но это не значит что её нет.
                                                                                                          0
                                                                                                          Поздравляю. Вы наконец поняли то, что это НЕ ОПЕРАТОР.
                                                                                                          { } — это, если мне не изменяет память, называется операторными скобками. $ — это специальный символ или что-то в этом роде. Их сочетание к операторам отношениея не имеет.

                                                                                                          Удачи в изучении программирования!
                                                                                                            0
                                                                                                            Приведите, пожалуйста, пункт спецификации РНР, где рассказывается об этом.
                                                                                                            Спасибо.
                                                                                                              0
                                                                                                              www.google.ru/search?hl=ru&q=%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B5+%D1%81%D0%BA%D0%BE%D0%B1%D0%BA%D0%B8&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=

                                                                                                              Первая ссылка, там и о РНР. Не вижу, что Вам помешало сделать это самому.
                                                                                                              Ковыряться в стандарте, чтоб найти номер пункта у меня, к сожалению, нет ни времени ни желания — это всё-таки настолько общие вещи, что они не являются специфическими для какого-то конкретного языва.
                                                                                                                0
                                                                                                                Операторные скобки — это всё-таки обычно тело if'а, циклов, илбо обособленная часть кода, в них заключённая. Не думаю, что в случае с ${$hi} они имеют такой-же смысл, скорее это именно спец. конструкция языка.
                                                                                                                  0
                                                                                                                  Вы меня извините, но вместо споров с мной займитесь лучше теорией. Не будете плутать в «оператор»/«операторные скобки»/«конструкция языка».

                                                                                                                  P.S. Операторные скобки — это совсем не «тело цикла». Блин, ну написано же человеческим языком: «команды, определяющие… блок команд». В разных языках это «{}», 'begin end' и т.д.
                                                                                                                    0
                                                                                                                    Не придирайтесь к лингвистическим особенностям, ясное дело это не тело цикла, это то что его ограничивает :) А о том, являются ли фигурные скобки в этом случае именно операторными или же обрабатываются PHP-парсером по иным правилам, можно судить только по исходным кодам Zend Engine, которые ни я, ни вы(наверняка), не читали.
                                                                                                                      0
                                                                                                                      Ага.

                                                                                                                      if ($expression) и $a = ($a+1)*2;

                                                                                                                      Скобки тут — это одно и тоже? Они выполняют одну и ту же функцию? Если рассуждать так же, как вы — то скобка тоже не оператор. Это конструкция языка. :-D
                                                                                                                    0
                                                                                                                    Вы меня не поняли.

                                                                                                                    Приведите, пожалуйста, пункт спецификации РНР, где рассказывается об этом.
                                                                                                    +2
                                                                                                    подача комента плохая, но с критикой я согласен.
                                                                                                  • UFO just landed and posted this here
                                                                                                      0
                                                                                                      можете отрефакторить такое?
                                                                                                      foreach ($groups as $group)
                                                                                                      {
                                                                                                      $permission = Cache:: read('Permission_'. $group);
                                                                                                      if (isset($permission[$this->Auth2->action()]))
                                                                                                      {
                                                                                                      $valid = $permission[$this->Auth2->action()];
                                                                                                      if ($valid)
                                                                                                      break;
                                                                                                      continue;
                                                                                                      }
                                                                                                      $valid = $this->Acl->check(array('Group' => array('id' => $group)), $this->Auth2->action());
                                                                                                      $permission[$this->Auth2->action()] = $valid;
                                                                                                      Cache:: write('Permission_'. $group, $permission);
                                                                                                      if ($valid)
                                                                                                      break;
                                                                                                      }

                                                                                                      if (!$valid)
                                                                                                      $valid = $this->Acl->check($user, $this->Auth2->action());

                                                                                                      return $valid;
                                                                                                        0
                                                                                                        форматирование поехало:(
                                                                                                        • UFO just landed and posted this here
                                                                                                            +1
                                                                                                            create_function в пхп очень медленный, за наводку спасибо, буду думать:)
                                                                                                          +3
                                                                                                          Break2 — хороший вариант выхода из циклов, осуществляющих поиск по двумерному массиву:
                                                                                                          for ($i=0;$i<X;$i++) for ($j=0;$j<Y;$j++) { ... if (...) break 2; }
                                                                                                          • UFO just landed and posted this here
                                                                                                              0
                                                                                                              Вставить еще одну проверку во внешний цикл? Вынести в отдельную функцию?
                                                                                                                0
                                                                                                                Зачем?
                                                                                                            +6
                                                                                                            Многие вещи очевидны для тех, кто хоть раз читал документацию PHP.
                                                                                                              –3
                                                                                                              Я бы даже сказал для тех кто хоть раз открывал книгу по PHP, причем для тех кто ее не только открывал, но еще и читал, понятно что большая часть статьи просто не соответствует действительности.

                                                                                                              И мне пофиг на минусующего меня автора данной статьи с его великим самомнением:)
                                                                                                              +1
                                                                                                              новички это такие ребята которые еще не заглянули в langref? мне кажется подобные статьти можно с уверенностью назвать IT-графоманством. *заранее попросил прощения у своей кармы*
                                                                                                                –3
                                                                                                                а вот и да!
                                                                                                                  0
                                                                                                                  А вот и не буду бить по вашей карме :-) Называйте как хотите.

                                                                                                                  Только знаете ли, не все начинают изучение с внимательного прочтения мануала. Даже многие опытные програмисы не заглядывают в официальный мануал основ языка. Потому что обычно изучение php начинается со статей типа «Выучите язык за 26 уроков». Эти статьи тоже можно так назвать? А там знаете ли таких вещей не пишут.
                                                                                                                    0
                                                                                                                    > Даже многие опытные програмисы

                                                                                                                    Таких вообще нельзя называть программистами. Тот, кто не знает, для чего нужен break является только начинающим программировать на императивных языках (вне зависимости от количества строк написанного production-кода).
                                                                                                                  –3
                                                                                                                  спасибо, информативно, занес в закладки
                                                                                                                    +1
                                                                                                                    Хм, мне кажется, даже кто не знал — один раз прочел и уже запомнил =)
                                                                                                                    0
                                                                                                                    Единственное, что действительно полезно — так это конструкция ${}
                                                                                                                    Но я, например, использую её в строках, например, если нужно вывести переменную внутри текста.
                                                                                                                    Т.е. «Превед ${var1}_медвед» вместо «Превед „.$var1.“_медвед». Имхо, так гораздо читабельнее.
                                                                                                                      –6
                                                                                                                      Пы.сы. Как меня раздражиют негативно настроенные малолетние или великовозрастные уебаны, кто бы знал. Дедовщинщики, блядь, с чувством безнаказанности. Отлавливать вас надо по одному и учить правильно жить. С позитивом в душе.
                                                                                                                        0
                                                                                                                        Может быть «Превед {$var1}_медвед»? =)
                                                                                                                          –2
                                                                                                                          Ой, да, точно, затупил, пасип.
                                                                                                                            0
                                                                                                                            Хотя на самом деле работает и так, и так :)
                                                                                                                              0
                                                                                                                              А я вот не помню, если честно :) неделю назад последний раз это юзал :) Щас посмотрел код, я все-таки ${var1} использую.
                                                                                                                            –4
                                                                                                                            Да, в строках — это уже немного другое.
                                                                                                                              0
                                                                                                                              Значит не то написал. Кстати, а конструкция {$var1} пришла из руби все-таки? И когда она появилась, может знает кто? Я нашел её совершенно случайно, методом научного тыка. В мануалах не видел. Может я невнимательный?
                                                                                                                        –2
                                                                                                                        ничего путного. написали бы уже про стримы что-ли.
                                                                                                                          0
                                                                                                                          )) Я так понял тема работы с потокам уже для всех раскрыта, и каждый может написать свой сервер на пхп.
                                                                                                                          • UFO just landed and posted this here
                                                                                                                              0
                                                                                                                              а вы его смотрели?
                                                                                                                              • UFO just landed and posted this here
                                                                                                                              0
                                                                                                                              Да нет, тема не раскрыта, просто автор бесконтрольно со своими дружками минусует всех кто пишет реальную оценку на его статью.
                                                                                                                          • UFO just landed and posted this here
                                                                                                                              –10
                                                                                                                              Вот про таких как ты я и говорил, умник.
                                                                                                                              • UFO just landed and posted this here
                                                                                                                                  –3
                                                                                                                                  Логическую цепочку в студию, будте добры.
                                                                                                                                  Если её нет — то Вы пустозвон, так ведь?
                                                                                                                                    –3
                                                                                                                                    дюд, это был вопрос, не кипятись =)
                                                                                                                                      0
                                                                                                                                      Не, не вопрос, а предположение. На вопрос я бы ответил прямо.
                                                                                                                                        –8
                                                                                                                                        Неудачнеггг!!!111 :)
                                                                                                                              0
                                                                                                                              а кому-нибуть приходилось в switch-е continue использовать, я вот сижу и ломаю голову… не могу припомнить ни одного случая, чтобы понадобилось даже
                                                                                                                                0
                                                                                                                                Хорошо, что подняли этот вопрос. Смотрите. Если у вас switch в цикле, и внутри него вы пишете continue у вас не произойдет перехода к началу цикла. У вас будет break из свича. В этом случае в цикле надо написать continue 2.
                                                                                                                                  0
                                                                                                                                  а действительно, вот будет засада… смотришь в код все вроде правильно, а работает совсем наоборот
                                                                                                                                    0
                                                                                                                                    Внесу-ка я это в статью пожалуй.
                                                                                                                                0
                                                                                                                                Про DECLARE не знал. Остальным активно пользуюсь. Особенно первыми двумя.
                                                                                                                                  –7
                                                                                                                                  можно подумать что у тебя как не задача так вложенный цикл
                                                                                                                                  +1
                                                                                                                                  спасибо за статью, почти все для меня было неизвестно
                                                                                                                                  • UFO just landed and posted this here
                                                                                                                                      0
                                                                                                                                      А declare останется, не знаете?
                                                                                                                                      0
                                                                                                                                      В этом примере нет знака $, потому что при обращении к методу или свойству класса он не требуется.

                                                                                                                                      Не путайте людей.
                                                                                                                                      Мы обращаемся к методу или свойству экземпляра (объекта) класса.

                                                                                                                                      При обращении к свойствам класса нужно $ указывать: stdClass::$myParam, и, следовательно, stdClass::${...}.
                                                                                                                                        0
                                                                                                                                        Вы сейчас говорите про СТАТИЧЕСКИЕ методы и свойства класса. Тогда — да. У меня же в примере обычные, динамические методы.
                                                                                                                                        0
                                                                                                                                        Уже не раз тут это писал… это ведь общеизвестно, стоит только прочесть официальную документацию и ОБДУМАТЬ ее, как ее использовать. Это между прочим и есть исходное значение слова «хакинг», баминг когда, нахождение малозатратных и высокоэффективных путей решения задачи.
                                                                                                                                        И все станет понятно и такие статьи можно будет пачками писать. Но все равно спасибо за ваш труд, хотя бы по хорошему оформлению статьи, с примерами и т.п. С уважением.
                                                                                                                                          0
                                                                                                                                          про declare начинаешь узнавать подробней когда начинаешь юзать pcntl_fork().
                                                                                                                                            0
                                                                                                                                            Отличная статья. Показывает, что PHP'шники часто изучают язык по примерам, и испытывают лёгкий шок, когда обнаруживают неизвестные им конструкции. После этого пишут статьи.

                                                                                                                                            Зато теперь говнокодеры знают про include и break — ведь они всё равно не будут ни мануалов читать, ни книг. Всё польза.

                                                                                                                                            Only users with full accounts can post comments. Log in, please.