+ Ответить в теме
Показано с 1 по 11 из 11
  1. #1
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757

    А знаете ли вы, что...

    Неплохо в этой теме описывать некоторые "необычности".
    Например, результат этих команд разный:
    PHP код:
    c("memo1")->text "sdfsd"."\n"."dавыыва"
    PHP код:
    c("memo1")->text 'sdfsd'.'\n'.'dавыыва'
    ps объяснение: Для вывода текста в PHP используются простые (') и двойные (") кавычки. В чем разница между ними?
    В простых кавычках парсер PHP ищет только простую кавычку (как символ конца) и обратный слэш (для ввода простой кавычки). В двойных - парсер умеет многое другое. Например, видеть переменные
    PHP код:
    echo "Hello, $name!"
    , символы
    PHP код:
    echo "Hello\nworld!"
    и даже более хитрые переменные
    PHP код:
    echo "${config['hello']}, ${position}th world!"
    Текст в простых кавычках будет выводиться побыстрее, парсеру почти не надо думать. Так что смотрите внимательно при выводе текста
    Последний раз редактировалось noRoman; 03.01.2011 в 23:20.
    PS Я хороший программист потому что читаю это!

  2. Пользователь сказал cпасибо:

    DENFER (18.01.2011)

  3. #2
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    В PHP существует предопределенная константа PHP_EOL. В ней - "\n", если сервер *nix или "\r\n" если сервер на Windows.
    Можно использовать для вывода текста:
    PHP код:
    c("memo1")->text 'sdfsd'.PHP_EOL.'dавыыва';
    //или
    c("memo1")->text "sdfsd".PHP_EOL."dавыыва"
    При этом эти команды идентичны.
    А можно использовать для определения системы сервера
    PS Я хороший программист потому что читаю это!

  4. #3
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Как лучше написать в коде инкремент переменной?
    При увеличении переменной на единицу обычно пишут - $i++. Однако быстрее будет выполняться ++$i.
    Рассмотрим $x =$i++; Переменной $x будет присвоено значение переменной $i до того, как $i будет увеличено на единицу.Получается, что компилятор должен сохранить значение $i, чтобы использовать его в любом выражении с переменной $i. А если запишем: ++$i значение переменной увеличивается на единицу до вычислений, поэтому нет необходимости хранить временное значение. Вот и получается мизерная, но оптимизация. Плюс повторили основы PHP
    PS Я хороший программист потому что читаю это!

  5. 2 пользователя(ей) сказали cпасибо:

    forumrulez (04.01.2011), Kiro (04.01.2011)

  6. #4
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Различия echo и print.
    PHP код:
    echo "text";
    print 
    "text"
    Вывод будет одинаковым, однако:
    а) print возвращает true/false в зависимости от того, удачен вывод или нет (Я не знаю ситуации возвращения false, но мне кажется это идет от языка С, где мы можем назначать потоки вывода). echo ничего не возвращает
    б) echo нельзя использовать со скобками, т.е. echo(123) - выдаст ошибку, а print(123) - выведет как надо (т.к. print() - функция, echo - конструкция языка)
    в) echo работает быстрее чем print. Разница несущественная, но все же
    г) В echo можно передать несколько параметров для вывода через запятую echo 123, 'aaaa', 33; и они выведутся последовательно. В print нет.
    Последний раз редактировалось noRoman; 04.01.2011 в 00:21.
    PS Я хороший программист потому что читаю это!

  7. Пользователь сказал cпасибо:

    forumrulez (04.01.2011)

  8. #5
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Тернарная условная операция выполняется быстрее.
    логическое выражение ? истина : ложь
    пример:
    PHP код:
    if ($x>$y) {$x=0;} else {$y=0;}
    // или
    $x>$y $x=$y=0
    Более практичный пример:
    PHP код:
    $max_value $x>$y $x $y
    Но слишком не злоупотребляйте, т.к. снижается читабельность кода. Но мне такие выражения нравятся
    Последний раз редактировалось noRoman; 04.01.2011 в 00:37.
    PS Я хороший программист потому что читаю это!

  9. Пользователь сказал cпасибо:

    Acid-UA (04.01.2011)

  10. #6
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Как преобразовывается тип переменной в PHP?
    PHP не требует (и не поддерживает) явного определения типа при объявлении переменной; тип переменной определяется согласно контексту, в котором она используется. Это из учебника по PHP, а теперь "по-русски"
    Переменная будет того типа, который вы ей приравниваете.
    PHP код:
    $a 12// integer (целое)
    $b 12.12// float (c плавающей точкой)
    $c "text"// string (строковая)
    $d true// boolean (булевое, т.е. принимать только одно из двух значений 0/1 или true/false)
    $e c('edit1') ; // object (объект. Напишите после этой инструкции: pre ($e->text) ; и получите text в edit1
    $d = array(1223) ; // array (массив)
    // resource (ресурс) - этот тип мы рассматривать не будем. К нему относятся (самые расспространенные на форуме :) ) - curl, ftp, gd и т.п. 
    А теперь самое интересное:
    PHP код:
    $a 12kl23//integer=12
    $b 12.123dgsdfg123// float=12.123
    $c 12e3tyrw// float 12000
    $d "10 хрюшек" "2 пряника"// integer=12 :) 
    Почему так происходит? При присваивание переменной некого значения происходит "опознавание" типа. Если встречаются только цифры и нет ".", "Е" или "е", то это целое. Если встретилось что-то из этого ".", "Е" или "е" - значит тип float. Если начинается с букв в кавычках (одинарных или двойных), то интерпретируется как string. Без кавычек true/TRUE/tRuE или false/FALSE/FaLsE определяется как тип boolean.
    Теперь коснемся приведения типов к другому типу.
    PHP код:
    $str "12.2131dtgs"// "12.2131dtgs"
    $fl 12.2131dtgs// 12.2131
    $a = (int)$fl// 12 отсекается все от точки
    $b = (string)$fl// "12.2131" у $fl PHP уже отсек лишние символы
    $c = (boolean)12.2// true. здесь true всегда, если значение не 0 или не пустая строка (даже если число отрицательное все равно TRUE. только 0 или пустая строка приводят к FALSE)
    $d = (array)$str// массив $d[0] = "12.2131dtgs"
    $e = (array)$a// массив $e[0] = 12 (массив из одного элемента) 
    зачем нам это надо? Во-первых понять механизм, т.к. это я считаю преимуществом у PHP, во-вторых, можно использовать как своеобразную защиту "от дурака". Когда просят ввести число, а пользователь вводит строку. Ну и в-третьих, можно проделывать такие вычисления, которые в других языках неминуемо ведут к условным операторам. Например, если $x>$y, то $z=23. Если $x<$y, то $z=-12.3. Если $x=$y, то $z=0.
    PHP код:
    $z 1-($x==$y)+23*($x>$y)-12.3*($x<$y); 
    Круто получается
    PS Я хороший программист потому что читаю это!

  11. #7
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Под знаком переменной
    Всем известно что переменная обозначается знаком $. Но мало кто знает что можно сделать переменной значение переменной.
    PHP код:
    $a "ups";
    $
    $a "ogo";
    $$
    $a 123;
    pre($a);
    pre($ups);
    pre($ogo); 
    практическое значение этому сложно придумать, если только запутать код Но может кому это пригодится
    Последний раз редактировалось noRoman; 06.01.2011 в 11:34.
    PS Я хороший программист потому что читаю это!

  12. #8
    Новичок
    Регистрация
    09.01.2011
    Сообщений
    27
    спасибо узнал кое что новое =)

  13. #9
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Продолжение "Под знаком переменной".
    Вот мне и пригодилась эта особенность PHP. Правда в "чистом" PHP, а не в DevelStudio.
    Мой скрипт должен был получать переменные в большом количестве и из-за этого код разрастался в длину. Вот что я сделал:
    PHP код:
    $arr_var = array("x"=>0"y"=>0"copy"=>"default""name"=>"noname""status"=>"user""code"=>0); // это еще мало переменных. Только для примера :)
    foreach ($arr_var as $var => $value){
      if (isset(
    $_POST[$var])){ $$var $_POST[$var]; } else { $$var $value;}

    Вот и все
    PS Я хороший программист потому что читаю это!

  14. #10
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Иногда необходимо в объекте label создать что-то вроде счетчика. Тогда мы обычно пишем так:
    PHP код:
    c("label1")->caption++;
    // или так
    ++c("label1")->caption;
    // на некоторое число:
    c("label1")->caption+=3
    и все работает хорошо, но если у нас счетчик основан на числе с плавающей точкой, то получаем (как бы) неожиданный результат:
    PHP код:
    // в label1 всегда будет 0.5
    c("label1")->caption+=0.5
    почему так происходит? Дело в том, что в label у числа с плавающей точкой автоматически точка заменяется запятой и когда мы вновь увеличиваем счетчик на наше значение, то получается что к "0,5" прибавляем 0.5 и у нас получиться 0+0.5 = 0.5 и это число в label будет выглядеть опять как 0,5 (как PHP проводит такие смешения подробнее см. выше в Как преобразовывается тип переменной в PHP)
    выходим из этой ситуации так:
    PHP код:
    c("label1")->caption str_replace(",",".",c("label1")->caption) + 0.5
    Последний раз редактировалось noRoman; 23.03.2011 в 17:06.
    PS Я хороший программист потому что читаю это!

  15. #11
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Давно меня здесь не было... Продолжим.
    Бывают ситуации, когда необходимо отследить много условий по нескольким переменным и получается большое дерево из IF. Однако можно использовать SWITCH!!!
    Вот пример, если нам надо отследить попадание в прямоугольники с координатами (20,20;100,100) и (200,200;250,250) (в скобках координаты левого верхнего угла и нижнего правого):
    PHP код:
    switch(true){
      case (
    $x>20 && $x<100 && $y>20 && $y<100):
        
    // попали в первый прямоугольник
      
    break;
      case (
    $x>200 && $x<250 && $y>200 && $y<250):
        
    // попали во второй прямоугольник
      
    break;

    Также стоит помнить как работает SWITCH. Встречает первое совпадение, отрабатывает его и заканчивает работу командой break. Теперь на "пальцах":
    PHP код:
    switch(true){
      case (
    $x>20 && $x<100 && $y>20 && $y<100):
        
    // попали в первый прямоугольник
      
    break;
      case (
    $x>200 && $x<250 && $y>200 && $y<250):
        
    // попали во второй прямоугольник
      
    break;
      case (
    $lazer>100):
        
    // что-то еще отслеживаем
      
    break;

    в этом случае, если мы попадаем в первый или во второй прямоугольник, то условие ($lazer>100) отрабатываться не будет, т.к. одно из совпадений, идущих ранее, отработано.
    Поэтому используя SWITCH в такой "необычной" ситуации продумывайте логику своих условий. Успехов!
    PS Я хороший программист потому что читаю это!

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения