Здравствуйте, гость ( Вход | Регистрация )

![]() ![]() |
11.2.2007, 22:30
Сообщение
#1
|
|
![]() Старожил Сообщений: 229 Регистрация: 11.2.2007 Пользователь №: 58 483893 Репутация: 4 ![]() |
Может, кто и помнит: в своё время выходил (не знаю как сейчас) журнал "Наука и Жизнь". Так вот, там была масса полезной информации. А также был там один раздельчик: "Маленькие хитрости". В нём люди писали о каких-то своих наблюдениях, которые помогают в жизни. (Это относилось к технической стороне). Сейчас примером этой рубрики можно считать передачу "Оч.Умелые ручки". Я предлагаю сделать что-нибудь на подобии этой рубрики.
Итак, делимся общими соображениями. Соображение №1 Допускается следующее приведение типов: * (int), (integer) - приведение к целому * (real), (double), (float) - приведение к типу double * (string) - приведение к строке * (array) - приведение к массиву * (object) - приведение к объектной переменной Соображение №2 Массив может сортироваться функциями asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), и uksort() в зависимости от типа желаемой сортировки. Подсчет количества элементов массива осуществляется функцией count(). Перемещаться по массиву позволяют функции next() и prev(). Другим типовым способом перемещения по массиву является использование функции each(). Соображение №3 Использование __FILE__ и __LINE__ Код <?php function report_error($file, $line, $message) { echo "An error occured in $file on line $line: $message."; } report_error(__FILE__,__LINE__, "Something went wrong!"); ?> Соображение №4 Вы можете определить дополнительные константы с помощью функций define() и undefine(). Пример. Описание констант Код <?php define("CONSTANT", "Hello world."); echo CONSTANT; // outputs "Hello world." undefine ("CONSTANT"); ?> Соображение №5 Добавление 3 к текущему значению $a может быть записано как '$a+=3'. Это значит следующее : 'возьми значение $a, добавь к нему 3 и присвой это обратно $a. Кроме того, что это быстрее и понятнее, такой тип выражений быстрее исполняется. Значение '$a+=3' как и значение обычного присваивания это присвоенное значение. Заметьте, что оно не равно 3, а является общим значением $a и 3. Любой бинарный (имеющий 2 операнда - прим. авт.) оператор может быть записан таким методом, например : '$a-=5' (вычесть 5 из значения $a), '$b*=7' (умножиить значение $a на 7) и так далее. Соображение №6 Передача по ссылке По умолчанию, аргменты функции передаются по значению. Если вы хотите в функции модифицировать аргументы, то можете передать их по ссылке. Если вы хотите, чтобы аргумент всегда передавался по ссылке, то следует поставить амперсенд (&) перед именем аргумента в объявлении функции : Код function foo( &$bar ) { $bar .= ' and something extra.'; } $str = 'This is a string, '; foo ($str); echo $str; // выведет : 'This is a string, and something extra.' Если вы хотите передать аргумент по ссылке в случае, когда по умолчанию такого не делается, то добавьте амперсенд перед именем аргумента в вызове функции : Код function foo ($bar) { $bar .= ' and something extra.'; } $str = 'This is a string, '; foo ($str); echo $str; // выведет 'This is a string, ' foo (&$str); echo $str; // выведет 'This is a string, and something extra.' Значения по умолчанию Функции могут определять значения по умолчанию для скалярных аргументов в стиле C++ как показано : Код function makecoffee ($type = "cappucino") { echo "Making a cup of $type.\n"; } echo makecoffee (); echo makecoffee ("espresso"); Этот пример выведет следующее : Цитата("значение") Making a cup of cappucino. Making a cup of espresso. Значение по умолчанию должно быть константой, а не переменной или, к примеру, членом класса. Учтите, что когда вы объявляете аргументы по умолчанию, они должны быть справа от всех "неумолчальных" аргументов, в противном случае это не будет работать, как задумано. Соображение №7 CLASS Класс - это набор переменных и функций, работающих с этими переменными. Класс определяется следующим образом : Код <?php class Cart { var $items; // Количество вещей в корзине покупателя // Добавить $num наименований типа $artnr в корзину function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // Убрать $num наименований $artnr из корзины function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } else { return false; } } } ?> Это определения класса Cart, который состоит связного списка наименований товаров в корзине и двух функций для добавления и удаления вещей из корзины. Классы это типы, то есть, заготовки для реальных переменных. Вы должны создавать переменные желаемого типа, используя оператор new : Код $cart = new Cart; $cart->add_item("10", 1); Таким образом, мы создали объект $cart класса Cart. Функция add_item() этого объекта вызывается для добавления 1 товара номер 10 к корзине. Классы могут быть расширениями других классов. Расширенный класс обладает всеми переменными и функциями базового класса и тем, что вы определите при расширении класса. Это делается используя ключевое слово extends : Код class Named_Cart extends Cart { var $owner; function set_owner ($name) { $this->owner = $name; } } Это определяет класс Named_Cart, который имеет все переменные и функции класса Cart плюс дополнительную переменную $owner и дополнительную функцию set_owner(). Вы можете создать поименованую корзину обычным образом и установить или получить владельца корзины. Также вы можете использовать и нормальные функции корзины в поименованой корзине : Код $ncart = new Named_Cart; // Создать корзину $ncart->set_owner ("kris"); // Указать владельца print $ncart->owner; // Распечатать имя владельца корзины $ncart->add_item ("10", 1); // (унаследовано из обычной корзины) Внутри функций класса переменная $this означает сам объект. Вы должны использовать $this->нечто для доступа к переменной или функции с именем 'нечто' внутри объекта. Конструкторы это функции в классе, которые автоматически вызываются, когда вы создаЈте новую переменную данного класса. Функция становится классом, когда она имеет такое же имя, как и сам класс. Код class Auto_Cart extends Cart { function Auto_Cart () { $this->add_item ("10", 1); } } Мы определили класс Auto_Cart который является тем же классом Cart плюс имеет конструктор, который инициализирует корзину при создании, наполняя её одним товаром типа "10". Конструкторы также могут иметь аргументы, и эти аргументы могут быть необязательными, что делает конструктор более полезным : Код class Constructor_Cart { function Constructor_Cart ($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Покупаем вся одно и то же : $default_cart = new Constructor_Cart; // А тут что-то новое : $different_cart = new Constructor_Cart ("20", 17); Соображение №8 К вопросу о регулярных выражениях Возникла необходимость получить значаения прописанные в коде html страниц? Точнее ссылки переходов тегов <a> и пути картинок тегов <img>? Вот код на этот случай: Код <?php $page=file_get_contents("http://url сайта"); //Обработаем ссылки $regexp="/<a[^<>]*href\=[\'\"]*([^\'\" ]*)[\'\"]*[^<>]*>/i"; preg_match_all($regexp,$page,$links,PREG_SET_ORDER); print "Все ссылки:\r\n<br>"; //<br> стоит лишь для того, чтобы удобно читалось в браузёре. Если вы всё это богатство будете писать в файл, то убейте его. foreach($links as $link) print $link[1]."\r\n<br>"; //<br> стоит лишь для того, чтобы удобно читалось в браузёре. Если вы всё это богатство будете писать в файл, то убейте его. //Обработаем кртинки $regexp="/<img[^<>]*src\=[\'\"]*([^\'\" ]*)[\'\"]*[^<>]*>/i"; preg_match_all($regexp,$page,$pics,PREG_SET_ORDER); print "Все пути к картинкам:\r\n<br>"; //<br> стоит лишь для того, чтобы удобно читалось в браузёре. Если вы всё это богатство будете писать в файл, то убейте его. foreach($pics as $pic) print $pic[1]."\r\n<br>"; //<br> стоит лишь для того, чтобы удобно читалось в браузёре. Если вы всё это богатство будете писать в файл, то убейте его. ?> Соображение №9 К вопросу о количестве прожитых лет... Итак, имеется 2 даты.Одна - это дата рождения, вторая - это сегоднешняя. Все даты получены функцией mktime(). Нужно вычислить сколько человеку полных лет. Как это делается? Да легко! (только надо учитывать, что отсчёт ограничен 1970 годом.) Код <? $years = date("Y", time() - $born) - 1970; echo($years); ?> Соображение №10 Где найти инфу?!?! Запусти и выбери подходящую тебе переменную. Код <pre> <? print_r($_SERVER); ?> Можно поискать и вот так: Код <? phpinfo(32); ?> Или так: code] <?php phpinfo(); ?> [/code] Соображение №11 Как заменить переменные в строке брузера? Например так: есть url вида http://www.site.ru/index.php?page=indx&id=145. Если в .htaccess прописать следующие директивы, то мы сможем обратиться к данному адресу с помощью url вида http://www.site.ru/indx-145. Код RewriteEngine on RewriteRule ^([a-z]+)-([0-9]+)$ /index.php?page=$1&id=$2 Первая строка включает директиву перезаписи url. Вторая строка - это собственно правило, первая часть которого - шаблон, вторая замена: символ ^ означает начало строки; в круглые скобки берутся подмаски, к которым в последствии можно обратиться с помощью символа $ и цифры означающей место подмаски в строке; в квадратные скобки берутся доступные символы; + означает одно и более вхождений; символ $ означает конец строки. Ещё можно в Яндексе mod_rewrite поискать (сразу не ужасайтесь...) Или здесь посмотреть: http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html http://www.egoroff.spb.ru/portfolio/apache/rewriteguide.html Соображение №12 Почему с'апложенные jpeg-файлы не отобpажаются? (бьются?) Веб-сервер - русский Апач Все дело в том, что русский Апач по умолчанию производит перекодировку файлов. Так, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20). Для борьбы с этим эффектом нужно добавить в конфигурационный файл Апача httpd.conf следующее: Код <Location> CharsetRecodeMultipartForms Off </Location> Соображение №13 Как опpеделить валидность e-mail? Функция, предложенная Maxim Matyukhin: Код function valid_mail ($email) { if (eregi("^[_\\.0-9a-z-]+@([0-9a-z][0-9a-z-\\.]+)\\.([a-z]{2,3}$)", $email, $check)) { if (getmxrr($check[1] . "." . $check[2]) return "Valid"; else return "No MX for " . $check[1] . "." . $check[2]; } else return "Badly formed address"; } Есть другой способ, использующий сокеты, предложенный Jon S. Stevens Код <?php /* By: Jon S. Stevens jon@clearink.com Copyright 1998-1999 Jon S. Stevens, Clear Ink This code has all the normal disclaimers. It is free for any use, just keep the credits intact. */ function validateEmail ( $email ) { global $SERVER_NAME; $return = array ( false, "" ); list ( $user, $domain ) = split ( "@", $email, 2 ); $tld = $domain; if ( checkdnsrr ( $tld, "MX" ) ) { if ( getmxrr ( $tld, $mxhosts, $weight ) ) { for ( $i = 0; $i < count ( $mxhosts ); $i++ ) { $fp = fsockopen ( $mxhosts[$i], 25 ); if ( $fp ) { $s = 0; $c = 0; $out = ""; set_socket_blocking ( $fp, false ); do { $out = fgets ( $fp, 2500 ); if ( ereg ( "^220", $out ) ) { $s = 0; $out = ""; $c++; } else if ( ( $c > 0 ) && ( $out == "" ) ) { break; } else { $s++; } if ( $s == 9999 ) { break; } } while ( $out == "" ); set_socket_blocking ( $fp, true ); fputs ( $fp, "HELO $SERVER_NAME\\n" ); $output = fgets ( $fp, 2000 ); fputs ( $fp, "MAIL FROM: <info@" . $tld . ">\\n" ); $output = fgets ( $fp, 2000 ); fputs ( $fp, "RCPT TO: <$email>\\n" ); $output = fgets ( $fp, 2000 ); if ( ereg ( "^250", $output ) ) { $return[0] = true; } else { $return[0] = false; $return[1] = $output; } fputs ( $fp, "QUIT\\n" ); fclose( $fp ); if ( $return[0] == true ) { break; } } } } } return $return; } ?> Соображение №14 Как опpеделить валидность URL? Лично я использую следующую функцию: Код <?php function check_url($url) { if (eregi( '^http://', $url)) { $urlArray = parse_url($url); if (!$urlArray[port]) $urlArray[port] = '80'; if (!$urlArray[path]) $urlArray[path] = '/'; $sock = fsockopen($urlArray[host], $urlArray[port], &$errnum, &$errstr); if (!$sock) $res = 'DNS'; else { $dump .= "GET $urlArray[path] HTTP/1.1\\r\\n"; $dump .= "Host: $urlArray[host]\\r\\nConnection: close\\r\\n"; $dump .= "Connection: close\\r\\n\\r\\n"; fputs($sock, $dump); while ($str = fgets($sock, 1024)) { if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str)) $res[code] = trim(eregi_replace('^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*', "\\\\1", $str)); if (eregi("^Content-Type: ", $str)) $res[contentType] = trim(eregi_replace("^Content-Type: ", "", $str)); } fclose($sock); flush(); return $res[code]; } } else $res = "N/A"; return $res; } ?> Соображение №15 Имеем MySQL. Добавляем запись с автоинкрементным уникальным индексом. Как узнать значение последнего индекса? Есть замечательная функция mysql_insert_id ([идент. соединения]). Возвращает целое значение, которое и есть необходимый идентификатор, сгенерированный полем AUTO_INCREMENT в последем операторе INSERT. Подробно см. в доках по функциям PHP. |
|
-------------------- | |
![]() ![]() |
| Invision Power Board © 2007- IPS, Inc. | Сейчас: 6.2.2012, 0:25 |