Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Маленькие хитрости
Форум о жизни > Веб-мастеру > Создание сайта > Программирование
Барыга
Может, кто и помнит: в своё время выходил (не знаю как сейчас) журнал "Наука и Жизнь". Так вот, там была масса полезной информации. А также был там один раздельчик: "Маленькие хитрости". В нём люди писали о каких-то своих наблюдениях, которые помогают в жизни. (Это относилось к технической стороне). Сейчас примером этой рубрики можно считать передачу "Оч.Умелые ручки". Я предлагаю сделать что-нибудь на подобии этой рубрики.
Итак, делимся общими соображениями.

Соображение №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);

progit
чета я не догнал к чему приводит Использование __FILE__ и __LINE__?
Барыга
Цитата(progit @ 26.9.2006, 16:48) [snapback]2058[/snapback]

чета я не догнал к чему приводит Использование __FILE__ и __LINE__?

По порядку: константа (т.е. неизменяемое со временем величина, не путать с переменной smile.gif ) __FILE__ для данного файла - это полный путь к файлу исполняемого скрипта. Например, если в файле z:\home\localhost\www\tester\index.php прописать следующий код:
Код
<?
echo __FILE__;
?>

То он (скрипт) выдаст следующее:
Цитата(примерец)
z:\home\localhost\www\tester\index.php

Т.е. оперируя по своему усмотрению __FILE__ можно узнать путь до скрипта.

Итак, а теперь __LINE__ - она указывает на строчку исполняемого кода. По-моему, тут всё и так ясно.

Для чего всё это нужно? Решать вам, но может пригодиться при создании своего обработчика ошибок: он сам будет распознавать в каком файле, на которой его строчке произошёл сбой. И, в соответствии с алгоритмом, обрабатывать, выдавая то или иное сообщение простому Юзверю. А что если это не тупой Юзверь, а злобный Хацкер? Так он в два счёта сломает ваш скрипт, прочитав из стандартных сообщений об ошибках Апатча нужную ему информацию... А в остальном - использование __FILE__ и __LINE__ ограничено лишь вашей фантазией.
Барыга
Соображение №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);
?>

Или вот ещё:
Код

<?php
phpinfo();
?>


Соображение №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
ihoru
Блин, вот учил я эти классы, даже пытался запомнить зарезервированные слова smile.gif но никак не пойму, в чем конкретно их выгода, чем они лучше обычных функций??
Может кто-то объяснить??
Барыга
Соображение №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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2012 IPS, Inc.