За последние 24 часа нас посетили 20746 программистов и 1166 роботов. Сейчас ищут 603 программиста ...

Object-oriented PHP

Тема в разделе "Решения, алгоритмы", создана пользователем TheShock, 23 июл 2009.

  1. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Достаточно много можно видеть объектных оберток над стандартными примитивами в PHP.
    Но ни одна из тех, что я видел не могла быть использована в реальной ситуации.
    Даже встроенная ArrayObject очень скудна и навевает впечатление, что ее сделали "абы отстали с объектностью".
    Большинство оберток не умеют работать сами с собой, например:
    Код (Text):
    1. oArray('a', 'b', 'c')->merge(oArray('d', 'e'));
    (ничего не имею против автора и его демонстрационного класса, тем более, именно его творение подтолкнуло многих на написание подобных оберток)
    Также все обертки, которые я видел - реализовывали только базовый функционал, которого явно недостаточно, чтобы полноценно с ними работать.
    Ну и еще много недостатков.

    Я представляю альфа-версию полноценной обертки для объектной работы с примитивами:
    Object-oriented PHP

    Она лишена большинства недостатков известных оберток. Подробнее - на странице проекта.

    PHP:
    1. <?php
    2. $map
    3.         ->join(' ') // String
    4.         ->replace(',', 'зпт')
    5.         ->changeCase(Str::TITLE, Str::UP_FORCED)
    6.         ->insert('[вставлено]', 5)
    7.         ->length() // Number
    8.         ->multiply(4)
    9.         ->add(6, 9, new Number(15))
    10.         ->divided(5)
    11.         ->sum(Number::EVEN)
    12.         ->dump() // (Number) 1062.51
    13.         ->root(4)
    14.         ->round(3) // Just 3 symbols after dot
    15.         ->dump() // (Number) 5.709
    16.         ->round(Number::UP) // round to up (ceil)
    17.         ->hex('15abbf')
    18.         ->toString() // String ('1420223')
    19.         ->hash() // 'md5' as default
    20.         ->dump(); // (String) '0d1b1558224c8f3b125cd905c378c9f7'
    21.  
    Еще раз повторю - цель была не демонстрация возможностей PHP, а создании реальной обертки, которую вполне можно будет использовать в реальных проектах. Любителям поговорить о спичечной оптимизации в ущерб читабельности и грациозности кода прошу пройти сюда.

    Сразу предупреждаю за реплики алля "Зачем изобретать велосипед?", "ООП ради ООП" и "КГ/АМ" буду слать матом.
    Принимаю восторженные отзывы и конструктивную критику :)

    P.S. Спасибо Koc'y, что подтолкнул меня к этому.

    Сообщение на Хабрахабре
     
  2. mantell

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

    С нами с:
    7 окт 2008
    Сообщения:
    125
    Симпатии:
    1
    Это всё интересно, но без перегрузки операторов никогда бы классом Number пользоваться не стал.

    Вряд ли меня можно будет убедить, что нужно записывать так:
    PHP:
    1.  
    2. <?
    3. $num = new Number(10);
    4. $num -> add(1);
    5. ?>
    6.  
    а не так:
    PHP:
    1.  
    2. <?
    3. $num = 10;
    4. $num++;
    5. ?>
    6.  
    Это совсем простая операция. А если посложнее?
    PHP:
    1.  
    2. <?
    3. $y = 5;
    4. $z = 3;
    5. $x = cos(8 * pow($y - 1, 3) - 3 * $z) / pow(18 * $y - $z, 2);
    6. echo $x;
    7. ?>
    8.  
    PHP:
    1.  
    2. <?
    3. $y = new Number(5);
    4. $z = new Number(3);
    5. $x = new Number( Number::create($y -> get())
    6.            -> subtract(1)
    7.            -> power(3)
    8.            -> multiply(8)
    9.            -> subtract (
    10.                       Number::create($z -> get())
    11.                                  -> multiply(3)
    12.                                  -> get()
    13.                 )
    14.            -> cos()
    15.            -> divided (
    16.                       Number::create($y -> get())
    17.                                  -> multiply(18)
    18.                                  -> subtract($z -> get())
    19.                                  -> power(2)
    20.                                  -> get()
    21.                 )
    22.            -> get() );
    23. echo $x -> get();
    24. ?>
    25.  
    Что читабельнее?

    Со String наоборот сложные операции выполнять удобнее, так что здесь поддерживаю. В Map особенно не вглядывался, но сама идея подобного класса мне нравится.
     
  3. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Много методов, прикольно).
    public function toInt () {
    return (int) $this->number;
    }

    Вроде лучше через + 0 приводить к целому, но я не уверен.

    Можно еще добавить ф-ции перевода из байт в кб, мб, ...
     
  4. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Такие вещи как changeCase или replace я бы реализовал в виде одного метода map или each в который передаётся имя callback функции, т.к. данные методы к массивам в принципе никакого отношения не имеют и только "раздувают" интерфейс.
     
  5. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    [Обновлена версия. Исправленно несколько достаточно критических багов]

    PHP:
    1. <?
    2. $y = new Number(5);
    3. $z = new Number(3);
    4. $x = $y
    5.     -> copy()
    6.     -> subtract(1)
    7.     -> power(3)
    8.     -> multiply(8)
    9.     -> subtract (
    10.         $z
    11.           -> copy()
    12.           -> multiply(3)
    13.     )
    14.     -> cos()
    15.     -> divided (
    16.         $y
    17.           -> copy()
    18.           -> multiply(18)
    19.           -> subtract($z)
    20.           -> power(2)
    21.     );
    22. echo $x;
    23. ?>
    Это, конечно, если надо оставить $y и $z неизменными
    Я так понял, что затруднения написать данный пример не возникли? Это хорошо. Он выдает тот же ответ, что и формула.

    Но, если честно, имхо, для человека намного приятнее читать именно цепочечный вызов тяжелой функции.
    Смотри сам: можно видеть что за чем выполняется даже при беглом просмотре. Функция не пугает, в отличии от:
    Код (Text):
    1. $x = cos(8 * pow($y - 1, 3) - 3 * $z) / pow(18 * $y - $z, 2);
    Потому что записана так, как читает человек, а не машина:
    Икс равно: игрик, отнять один, вознести в третью степень, умножить на 8, отнять 3 зеда, и косинунс поделить на (18 игриков, от которых отняли зед и получили с них квадрат).
    А кое-что ты даже не сделаешь без дополнительный некрасивых действий(дополнительное расширение функционала). Например, как ты получишь кубичный корень? А тут:
    Код (Text):
    1. $x->root(3);
    2. (против)
    3. pow($x, 1/3)
    Кстати, можно записать даже так:
    PHP:
    1. <?php
    2. $x = $y
    3.     -> copy()
    4.     -> subtract(1)
    5.     -> power(3)
    6.     -> multiply(8)
    7.     -> subtract ($z->get() * 3)
    8.     -> cos()
    9.     -> divided (
    10.         $y
    11.           -> copy()
    12.           -> multiply(18)
    13.           -> subtract($z)
    14.           -> power(2)
    15.     );
    16. ?>
    Тем более, никто не заставляет, более того, даже не рекомендует работать с этим классом ВЕЗДЕ. Например, в циклах это просто не имеет смысла.
    Каждый из объектов, как я уже говорил готов принимать что себя, что встроенный примитив равнозначно. Можно писать:
    PHP:
    1. <?php
    2. $m = new Map(1, 2, 3);
    3. $i = new Number(2);
    4. $m[$i]; /* или */ $m[2]; // Работает равнозначно
    5. ?>
    Согласен, намного красивее писать $m[2], чем new Number(2);
    Думаю, чем тяжелее будут операции - тем красивее будет выглядеть именно обертка

    Тем не менее, основные цель создания класса Number были в том, чтобы можно было не прерывать цепочку - раз.
    Смело писать метод ->dump() не боясь, что там окажется integer или float - два.
    Я даже думал булево в объект забрать, но потом передумал :))

    Перезагрузки, к сожалению, без залезания в сырцы пхп не осуществить.

    +0, афаик, приводит просто к нужному типу ("1.234" + 0) приведет к флоату, а ("1" + 0) приведет к инту.
    Но спасибо, это тоже не помешает.

    Естественно, я буду расширять функционал. Функцию записал в пожелания :)
     
  6. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Ну вообще-то так и реализовано в core. Это просто алиасы для более удобной работы:

    PHP:
    1. <?php
    2. // Recursive str
    3. public function changeCase ($mode = self::VALUES, $strWhat = Str::ALL, $strMode = Str::UP) {
    4.     $this->walk('Str::changeCase', $mode, array($strWhat, $strMode));
    5.     return $this;
    6. }
    7.  
    8. public function filter ($mode = self::VALUES, $strMode, $add = false) {
    9.     $this->walk('Str::filter', $mode, array($strMode, $add));
    10.     return $this;
    11. }
    Я вот правда не знаю, как сделать передачу параметров методу walk, если в функции ключевой элемент будет не первым. Например:
    Код (Text):
    1. public static function find($what, $where,
    Хотя данная функция врядли нуждается в рекурсивном маппинге, но ключевой элемент (который был бы элементом массива) тут второй.
     
  7. kas1e

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

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    А помойму это приведет только к числу, в том числе и с точкой.

    лучше так - (int)$var.

    Соглашусь с mantell.

    Зачем было городить столько сложностей на примитивы?
     
  8. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    кстати, на счет Number. Имеет ли смысл заменить [add, subtract, multiply] на [plus, minus, times]? И, если имеет, на что заменить "divided" ?
     
  9. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    kas1e, выше уже описал.

    Вполне возможно, что либа будет работать и без Number вовсе (если он вам очень мешает), возвращая примитив, если соответствующего класса не будет:
    Код (Text):
    1. return (is_numeric ($elem) and class_exists ('Number')) ? new Number($elem) : $elem
    Но я не знаю, как поведет себя строка
    Код (Text):
    1. $obj instanceof Number
    Имхо, с Number удобнее, но, если так мозолит глаз, то вполне могу протестировать и подогнать либу под работу без Number
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Ну скоро мы доростём до
    PHP:
    1. <?
    2. Logic::if(Functions::create(Vars::getInstanse()->var)->noEmpty()->nois_Array()))
    3.        ->do(
    4.             PHP::OutPut("Hello Hell :p");    
    5.        )
    6.        ->Elseif(Functions::create(Vars::getInstanse()->var)->is_array())
    7.           ->do(
    8.               Logic::for(Vars::getInstanse()->var)
    9.                  ->do(
    10.                       Logic::if(Functions::create(Vars::getInstanse()->var)->noEmpty()->nois_Array())
    11.                          ->do(
    12.                               PHP::OutPut("Array value:".Vars::getInstanse()->var."\r\n")
    13.                          )
    14.                  ),
    15.               PHP::OutPut("You See Hell Logic - FOR")
    16.        )
    17.        ->Else(
    18.            PHP::OutPut("Ohh... Some Error?")
    19. );
    20. ?>
     
  11. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    а удобно ли будет применить такое в том же пагинаторе?
     
  12. kas1e

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

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    Просто если делать для удобство - то зачем заставлять юзера вместо

    PHP:
    1. $num = 10;
    писать

    PHP:
    1. $num = new Number(10);
    ? :)

    Это ведь на 12 символов больше. Да и по скорости, думаю, разница есть :)

    А в целом зачет.
     
  13. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Новый язык, ура, ура, ура!
     
  14. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    зачем же "\r\n"? можно поставить PHP::OutPut("Array value:".Vars::getInstanse()->var)->newLine();

    Koc, думаю, что вполне может быть удобно. Более того, можно унаследовать от Number класс PageLink, к примеру и сделать сразу метод для формирования ссылки. Алля.
    PHP:
    1. <?php
    2. class PageLink extends Number {
    3.   public function formLink () {
    4.     return "index.php?page=$this";
    5.   }
    6. }
    7. ?>
    Что-то типа того, в общем.

    kas1e, дык никто и не заставляет писать $num = new Number(10); :) ты пишешь это только тогда, когда это тебе нужно. Можно написать так:
    PHP:
    1. <?php
    2. $map = new Map(1, 2, 3);
    3. foreach ($map as $value) {
    4.   // $value тут уже объект Number
    5. }
    6. ?>
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    да у меня в этом деле опыта маловато =((
     
  16. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    [Обновлена версия]
    * Исправлено несколько ошибок, которые приводили к некорректной работе методов
    * Добавлен метод copy() во все объекты, чтобы работать с копией, не боясь повредить оригинал (например, как в формулах в предыдущих сообщениях и в примере):
    PHP:
    1. <?php
    2. $y = new Number(5);
    3. $z = new Number(3);
    4. $x = $y
    5.     -> copy()
    6.     -> power(3)
    7.     -> subtract (
    8.         $z -> copy() -> multiply(3)
    9.     )
    10.     -> divided (
    11.         $y -> copy() -> subtract($z)
    12.     );
    13. // $y и $z - остались неизменными
    + добавлен метод Map::isEmpty($mode), позволяющий проверить массив на пустоту стандартно ($mode = 0), рекурсивно, (нет ли каких-либо переменных, кроме массивов) ($mode = 1), рекурсивно (нет ли каких-либо непустых переменных) ($mode = 0)
    + добавлены String::preg* функции. Теперь pregMatch* возвращает массив найденных значений, а количество найденных можно получить через аргумент-ссылку. Проверить, было ли вообще что-то найдено можно с помощью аргумента-ссылки, или с помощью:
    PHP:
    1. <?php
    2. if ( $string->pregTest (/*args*/)) // найдено что-то
    3. if (!$string->pregMatch (/*args*/)->isEmpty()) // найдено что-то
    4. if (!$string->pregMatchAll (/*args*/)->isEmpty(1)) // найдено что-то
    * Отредактирован метод Number::toString() - теперь можно задать формат вывода числа: $num->toString(2, '.', ' '); а можно и не задавать.
    + добавлен метод Number::Convert (за счет чего класс Number стал намного интереснее сам по себе, а также - для наследования)
    PHP:
    1. <?php
    2. // Сколько байт в 300 гигабайтах?
    3. echo Number300)->convert('Bytes', 'GiB', 'B'), "\n"; // 322122547200
    4. // Сколько секунд в 3 сутках?
    5. echo Number(3)->convert('Time', 'Day', 'Second'), "\n";  // 259200
    6. // Сколько метров в одной морской миле?
    7. echo Number(1)->convert('Length', 'SeaMile', 'Metr'), "\n"; // 1852
    PHP:
    1. <?php
    2. /* Класс KurrencyKonverter унаследован от Number, в нем отредактировано только одно свойство.
    3.  * Подробнее - смотрите «KurrencyKonverter.php» в «Downloads»
    4.  */
    5. $uah = new KurrencyKonverter (500);
    6. // Сколько долларов у нас будет, если мы купим их в Украине за 500 гривень
    7. echo $uah
    8.         ->copy()
    9.         ->convert('Currency.Ua.Sell', 'UAH', 'USD')
    10.         ->toString(2); // 63,02
    11. // Сколько долларов у нас будет, если мы купим в Украине за 500 гривень рубли, а потом в России за эти же рубли - доллары
    12. echo $uah
    13.         ->convert('Currency.Ua.Sell', 'UAH', 'RUR')
    14.         ->convert('Currency.Ru'     , 'RUR', 'USD')
    15.         ->toString(2); // 44,77
     
  17. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    конвертер миль/дат/байт жирр!!

    Валюты - тоже офигенски.
    // I know what is right - «CurrencyСonverter»
    class KurrencyKonverter extends Number {

    дык зочем написал иначе?

    как извне задать значения курсов? хотя че я спрашиваю, можно просто написать еще один метод.

    Чего тебе не спится в 5 часов утра-то? ))
     
  18. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    TheShock
    В скайпе то появись :)

    По сабжу - это гут. Насколько уж я не люблю OOP ради OOP, но тут реализовано с чувством, толком и расстановкой. Typehinting правильно подмечен :)

    May I join you? :)
     
  19. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Я - заядлый KDEшник :)

    Действительно - можно написать дополнительный метод, или просто в конструкторе сразу поставить нужное значение курса, как я сделал в Конвертере.

    самый плодотворный период¸если честно.

    Приятно слышать.

    Конечно! Рад любой помощи. :)
    Хотя, в общем-то, сам справляюсь . Принимаю предложения.
    ПС. У меня возникла одна идея. Чуть позже воплощу в жизнь. Только с дотдеб пхп 5.3 поставлю.
     
  20. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    [Обновлена версия]
    Сейчас: 0.0.1.3

    Изменения:
    Добавил функции Number (); String (); Map (); по сути - это аналог методов Object::create() у соответсвующих объектах.К примеру, теперь можно так:
    PHP:
    1. <?php Map('a', 'b', 'c')->length(); ?>
    Методы Number::isEven(), Number::isOdd(), Number::rest($num) - число становится остатком от деления себя на $num

    Добавлен метод match во все объекты (см. пример ниже)

    Исправлены кое-какие мелкие ошибки в коде.

    И самое интересное: добавлена расширенная возможность работать с новыми возможностями php 5.3 , а именно с лямбда-функциями (при этом, если их не использовать, код совместим с более старыми версиями). Примеры:

    PHP:
    1. <?php
    2. $n = new Number(115);
    3. if($n->match(function ($t) {
    4.         return ($t->root(3)->gt(5)); // Если кубический корень числа больше 5 - истина, иначе - ложь
    5. })) {
    6.         echo '$n is greater than 125', "\n";
    7. } else {
    8.         echo '$n is smaller or equal than 125', "\n";
    9. }
    10.  
    11.  
    12. $s = new String("Some string with number(e.g. 12345), is here");
    13. echo String($s)->replace(array('string', 'number'), function ($r) {
    14.         return $r->changeCase(Str::ALL, Str::RANDOM);
    15. }); // Some sTrINg with NuMbEr(e.g. 12345), is here
    16. echo "\n";
    17.  
    18.  
    19. Map(1, 4, 7, 9, 15)->clear(function ($value, $key) {
    20.         if ($key == 0) {
    21.                 return true; // Элемент с ключем равным 0 оставляем независимо от значение
    22.         }
    23.         if ($value > 6 and $value < 13) {
    24.                 return true;  // Оставить только значения между 6 и 13
    25.         } else {
    26.                 return false; // Все остальное убить
    27.         }
    28. })->dump(); // Map (7, 9);
    29.  
    30.  
    31. // Метод сам определит - здесь лямбдда функция, или обычный параметр (например, строка, или объект String):
    32. echo String($s)->pregReplace("/([0-9]+)/", function ($m) {
    33.         return "!$m[0]!"; // Some string with number(e.g. !12345!), is here
    34. });        
    35. echo "\n";
    36.  
    37.  
    38. // Для более старых версий все-еще поддерживается старый синтаксис:
    39. echo String($s)->pregReplaceCallback("/([0-9]+)/", create_function('$m',
    40.         'return "!$m[0]!";' // Some string with number(e.g. !12345!), is here
    41. ));
    Ну и, при всей моей нелюбви к Руби из-за его ужасных beg; end; и т.п. тот метод, которым кичатся все Руби-прогеры :
    PHP:
    1. <?php
    2. Number(5)->times(function ($i) use ($n) {
    3.         echo ($i->isEven()) ? "Even: " : "Odd : ";
    4.         echo $n , "." , $i , ";\n";
    5. });
    Код (Text):
    1. Even: 5.0;
    2. Odd : 5.1;
    3. Even: 5.2;
    4. Odd : 5.3;
    5. Even: 5.4;
    Не так изящно, как в оригинале, конечно… Но, тем не менее, своя романтика в этом тоже есть. Тем более, обратите внимание - в Руби нельзя узнать, какой именно сейчас проход цикла, а тут можно :))

    Конечно, метод times врядли имеет право на существование, но я думаю, что это отличная демонстрация потенциала и намек на то, в какую сторону можно думать.

    На счет php 5.3. Думаю, уже через полгода он будет доступен на трети всех хостингов, а еще через годик он будет доминирующим. Стоит привыкать уже сейчас. Не всю ж жизнь php4 поддерживать - надо идти вперед.
     
  21. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Но, так как у меня теперь версия php 5.3.0, мне нужна помощь в проверке на совместимость с более старыми версиями. Хотя бы с 5.2.*

    Потому, кто еще не перешел, проверьте, пожалуйста, следующий код:

    PHP:
    1. <?php
    2. class Test {
    3.     private $test;
    4.     public function __construct () {
    5.         $this->test = $this;
    6.     }
    7. }
    8.  
    9. $m = new Map (new Test);
    10. $m[] = $m;
    11. $m->dump('Recursion Test', 1);
    12. ?>
    Интересует, не уйдет ли dump в бесконечную рекурсию на старой версии php.
    При использовании php 5.3 мне выдало следующую ошибку:
    Код (Text):
    1. Deprecated: Call-time pass-by-reference has been deprecated
    Потому из строки
    Код (Text):
    1. $recurs = (in_array(&$object, $parents, true)) ?
    пришлость убрать амперсанд (&). У меня сейчас работает, но почему-то мне кажется, что я его тогда не зря поставил.
     
  22. shurastik

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

    С нами с:
    22 фев 2008
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Латвия
    передача по ссылке описывается в определении функции. уже давно, кстати
     
  23. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Это где? В официальном мане не нашел такого
    Код (Text):
    1. bool in_array  ( mixed $needle  , array $haystack  [, bool $strict  ] )
    UPD: Понял. Как я могу описать в определении функции in_array передачу по ссылке, если это встроенная функция.
    Я знаю все недостатки использования ссылки. Я же говорю, что, скорее всего, я ее не зря туда поставил.
     
  24. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Объект всегда по ссылке передаётся, т.ч. неясно зачем ты туда поставил оператор &.
     
  25. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    еще раз говорю. насколько я помню без & на пхп 5.2 возвращало фолс в то время, как с & возвращало тру. Что меня неприятно удивило и пришлось поставить, хотя я знаю все эти ньюансы.
    Может ли кто-либо просто проверить, а не рассказывать о теории, которую я прекрасно знаю?