пятница, 22 апреля 2011 г.

php



Настройки php.ini

# Максимальный размер загружаемого файла.
upload_max_filesize = 2M

сменить кодировку сайта

header( "Content-Type:	text/html; charset=utf-8" );

Конструкции языка

foreach

конструкция: foreach ($params as $name => &$value) проход по ассоциативному массиву
в $name записываются ключи
в $value значения.
при изменении value будет изменяться массив $params

function &name() # результат возвращается по ссылке (не происходит копирования)

однострочные функции (аналог lambda в python)

$lambda = create_function('', 'return "g_item_id=%d";');
$sql = "delete from {imce_gallery_items} where " . (implode( " or ", array_map( $lambda, $key_array ) ) );

Классы

Объявление

class MyClass{
    var $attr;
    function __construct(){  // конструктор в php5.
        $this->attr = "1"; // ключевое слово $this - указатель на текущий объект
                                 // ключевое слово self - указатель на текущий класс
    }
}

В php4 название конструктора совпадает с название класса. Если в php5 для класса не найдена функция __construct, то в качестве конструктора берётся функция с именем совпадающим с именем класса.

Переменная класса (статическая переменная)

задать значения статических переменных

По-умолчанию статической переменной можно задать только статическое занчение:
class Module extends Common{
    public static $tt = "какое-то там дефолтное значение. нельзя даже написать \$tt=md5();";
}
Но можно определить значение более-менее динамически:
class Module extends Common{
    public static $tt;
    public static function init(){
        self::$tt = md5("param1");
    }
}
Module::init(); // сразу после объявления класса вызываем статическую функцию, которая определяет значения статических переменных.
На самом деле Module::init(); можно вызывать и перед кодом класса, т.к. php-файл сначала загружается и разбирается, а уже потом выполняется.

реестр объектов внутри класса

$a = new MyClass();
$b = new MyClass();
$c = new MyClass();
print_r( MyClass::$byId );

class MyClass{
    static public $byId = Array();
    function __construct(){
        self::$byId[] = $this;
    }
}

Работа с файлами

$a = fopen( "1.txt", "w"); // открыть файл на запись. если файл не существует, создать
fwrite( $a, "aaa" ); // записать строку в файл
fclose( $a );

Загрузка файла на сервер

<form method="post" enctype="multipart/form-data">

if(copy($_FILES["filename"]["tmp_name"], "c:/temp/".$_FILES["filename"]["name"]))
{
echo(
"Файл успешно загружен <br>");
}

Получить список директорий

function dirList($path){
    $componentList = array();
    foreach (scandir($path) as $dir){
        if (is_dir($path . $dir) && $dir !== '.' && $dir !== '..'){
            $componentList[] = $dir;
        }
    }
    return $componentList;
}


Работа с сетью

Curl

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://web20/ws/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // чтобы полученный ответ от удалённого сервера был доступен как результат curl_exec();
$res = curl_exec($ch);
curl_close($ch);

post

curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_POSTFIELDS$data);

get и urlencode

в php нет функции, которая по массиву создаёт url-строку (типа питоновской urllib.urlencode), поэтому:
$authParam = array('msgType'=>'loginRequest','session'=>$dsS,'login'=>$_POST["login"],'passwd'=>$_POST["pswd"]);
function dictToUrl($authParam){
    array_walk($authParam, create_function('&$v,$k', '$v = $k."=".urlencode($v) ;'));
    return implode("&",$authParam);
}

Буфер


интересная php-конструкция:

function obHandler($text) // $text, видимо, это содержимое буфера
{

    header('Content-Type: application/json; charset=UTF-8');

    return json_encode($GLOBALS['_RESULT']);
}
ob_start("obHandler"); // назначает callback

при завершении работы php-скрипта выведет содержимое массива

XML

DOM

Пусть есть некий xml-файл:
<?xml version="1.0" encoding="utf-8" ?>
<commands>
<command name="Get" table="User"/>
<command name="Get" table="User">
    <item>
        <guid>ce987888-c6ba-4527-bbff-85b356f9ad9b</guid>
    </item>
</command>
</commands>
Парсим его:
$xml = DOMDocument::load( "1.xml" );
$nodeList = $xml->documentElement->getElementsByTagName("command");
for ( $i=0; $i < $nodeList->length; $i++ ){
    $command = $nodeList->item($i); // тип DOMNode
    print $command->nodeName . "<br>"; // название "command" ноды из строки
                                       // <command name="Get" ....
    $domAttr = $command->attributes->getNamedItem("name"); // из DOMNamedNodeMaps вытаскиваем DOMAttr
    print sprintf( '%s="%s"', $domAttr->name ,$domAttr->value );
    print "<br>";
}

Именованные параметры <command name="Get" table="User"/> вытаскиваются из DOMNode через параметр attributes (тип DOMNamedNodeMaps).
Вложенные узлы <command name="Get" table="User"><item>... вытаскиваются из DOMNode через параметр childNodes (тип DOMNodeList).
Чтобы получить текст внутри узла: $guidNode->childNodes->item(0)->wholeText (но что-то подсказывает, что должен быть метод проще)

SOAP

SOAP - это протокол обмена сообщениями в формате XML, передаваемых по какому-то сетевому протоколу (чаще всего через HTTP).
С помощью SOAP реализуются различные web-сервисы. Все возможные запросы к web-сервису могут быть описаны в WSDL-документе (см. http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL). Для тестирования запросов есть хорошая программа soapUI.
Классы для работы с SOAP в PHP доступны после установки соответствующего расширения (extension). Под windows - это файл php_soap.dll, он есть в дистрибутиве PHP. В Denwer-е по-умолчанию SOAP не установлен.


Xdebug

1. скачать dll c http://xdebug.org/. Пред скачиванием сайт попросит отправить phpinfo(), зато потом расскажет подробно что и как надо устанавливать.
2. в php.ini надо прописать настройки:
[Xdebug]
zend_extension_ts = \usr\local\php5\ext\php_xdebug-2.1.0-5.2-vc6.dll
xdebug.profiler_enable=On
xdebug.profiler_output_dir=\traces
xdebug.profiler_output_name = "cachegrind.out.%t.%s"
я их добавил сразу после "секции" Dynamic Extensions
3. установил php-программу webgrind

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








Комментариев нет:

Отправить комментарий