My:PHP — различия между версиями

Материал из synset
Перейти к: навигация, поиск
(Работа с файлами)
(Работа с файлами)
Строка 176: Строка 176:
 
</clients>  
 
</clients>  
 
</pre>
 
</pre>
осуществляется таким образом
+
осуществляется таким образом:
 
<pre class="brush:php; gutter: false;">  
 
<pre class="brush:php; gutter: false;">  
 
   $clients = simplexml_load_file('clients.xml');  
 
   $clients = simplexml_load_file('clients.xml');  

Версия 09:30, 11 июля 2011

Введение

На локальной машине устанавливаем сервер, PHP, SQL при помощи http://www.denwer.ru/. В директорию WebServers/home/test1.ru/www/ помещаем файл test.php:

 
<html><head></head><body>
   <?php  echo("It's PHO<br>"); ?>
</head></html>

То, что находится между <?php ... ?> является php-программой. Любое количество таких вставок может находится внутри html-разметки. Запуская в браузере этот файл (он должен иметь расширение php, а не html!), получаем результат.

Скрипт php можно использовать для обработки посылки полей формы. Пусть в директории WebServers/home/test1.ru/ находятся файлы: www/index.html и cgi/form.php Поместим в index.html форму с двумя полями ввода и кнопкой посылки:

 
<form action = "../cgi/test.php" method="get">
Field1: <input type="text" name="F1"/> <br>
Field2: <input type="text" name="F2"/> <br>
<input type="submit"/>
</form>

Обработка посылки запроса /cgi/form.php?F1=aaa&F2=bbb файлом form.php выглядит так:

 
#!/usr/bin/php 
<?php
   echo("F1 = $_GET[F1]<br>");
   echo("F2 = $_GET[F2]<br>");
   $res = (int)$_GET[F1]+(int)$_GET[F2]
   for($i=1; $i<=$res; $i++ )
      echo("$i <br>");  
?>

Если запрос выполняется при помощи метода POST, то поля находятся в массиве $_POST. В начале php-файла находится путь к интерпретатору. Его надо указывать, если php-файл расположен в отдельной cgi-директории. Если же он в той же директории, что и html-файл, то не надо. (?)

Основы синтаксиса

  • Код php программы находится внутри блока между символами <?php и ?>. Дальше их обычно пропускаем. Можно php не писать, если это указано в настройках PHP (файл php.ini)
  • После <?php ... ?> можно вставлять html разметку и снова начинать програму на php. Когда PHP встречает закрывающие теги ?>, он выводит все, что он находит до следующего открывающего тега. Это удобно для вывода больших блоков текста.
  • Комментарии как в С++. Строчный комментарий также можно начинать с решетки #.
  • Между блоками php программы можно вставлять <!-- комментарий HTML -->. Он будет виден в исходнике html-страницы, но не будет отображаться в браузере.
  • Основной синтаксис (if, for, while, switch) совпадает с C++.
  • Константы задаются функцией: define(PI, 3.141592); define(HI,"Hello"); Имена констант принято отображать заглавными буквами. Логическая функция defined("PI"); проверяет определена ли константа с таким именем.
  • Тип переменных не объявляется, но подразумеваются следующие типы integer, string, boolean, double , array, object; Вызов echo(gettype($var)); печатает тип переменной.
  • Преобразование типов: $var = (int)$var;

Строки

Строка в PHP - это набор символов любой длины. В отличие от Си, строки могут содержать в себе также и нулевые символы, что никак не повлияет на программу. Иными словами, строки можно использовать для хранения бинарных данных. В PHP символ это то же самое, что и байт. Некоторую поддержку Unicode обеспечивают функции utf8_encode() и utf8_decode().

Строка может быть определена: 1) одинарными кавычками 2) двойными кавычками. Для использования одинарной кавычки внутри строки пишем \'. Внутри одинарных ковычек можно использовать двойные. Можно также использовать 3) heredoc-синтаксис:

 
$str = <<<EOD
Пример строки,
охватывающей несколько строчек.
EOD;

Переменные и экранирующие последовательности для специальных символов, встречающиеся в строках, заключенных в одинарные кавычки не обрабатываются. В двойных обрабатываются. Т.е. можно, например, написать (на месте $var будет её значение):

 
   echo "var=$var<br>\n";

Контатация сторок

 
   $a = "Hello ";
   $b = $a . "World!"; // $b содержит строку "Hello World!"

Массивы

  
   $arr[0]=1;  $arr[1]=2;             // простой массив

   $names["key1"] = "value1";         // ассоциативный массив типа map(ключ-значение)
   $names["key2"] = "value2";
   foreach ($names as $k => $v)       // распечатываем ассоциативный массив
      echo "$k: $v <br>";

   $lst[] = "aaa";                    // список
   $lst[] = "bbb";
   foreach ($lst as $v) {
      echo "<b>$v</b><br>";

   $arr = array(1, 2, 3, 4);
   foreach ($arr as &$v) $v = $v * 2; // $arr is now array(2, 4, 6, 8)

Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть "видны" из тела цикла.

Функции

 
function Add($x, $y)
{
   return (int)$x + (int)$y;
}
  • Если внутри функции есть строка "global $var;" это означает, что переменная $var объявлена как глобальная и будет видна во всех других функциях. В отличие от этого остальные переменные имеют локальную область видимости. Доступ к глобальным переменным можно также получить через массив $GLOBALS["var"]).
  • Объявление "static $state = 0;" означает, что значение переменной будет сохраняться при следующих вызовах функции (а начальное задаётся при первом вызове). Однако, если страница перегружается, жизнь этих переменных начинается заново.
  • Внимание! внешние к функции переменные, даже объявленные выше, в функции не видны.
  • В функциях можно использовать рекурсию.

Значения аргументов по-умолчанию:

 
  function makecup($type = "Чая")
  {
     return "Сделайте чашечку $type.\n";
  }
  echo makecup();
  echo makecup("Кофе");

Аргументы можно передавать по ссылке. Их изменение внутри функции будет "видно" наружу:

 
function Inc(&$var) // аргумент передается по ссылке
{
  return ++$var;
}

Возвращение значения по ссылке:

 
   function &returns_reference(){ return $someref; }
   $newref =& returns_reference();

Возвращение функцией массивов:

  
   function numbers(){  return array (0, 1, 2); }
   list ($zero, $one, $two) = numbers();
   echo $zero;

Объекты

 
   class Coor {  // Создаем новый класс Coor:
      var $name; // данные (свойства):
      var $addr;
      function Name(){ echo $this->name; } // метод, обращение к данным без $
   }

   $obj = new Coor;     // создаем объект класса Coor:
   $obj->name = "Alex"; // меняем значение поля
   $obj->Name();        // вызываем функцию

Наследование:

 
   class Child extends Parent {
   }

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

Тип файла задаётся последним аргументом функции fopen и совпадает с параметрами этой функции C:

  • "r" - чтение; "r+" - чтение и запись; указатель в начало файла;
  • "w" - запись; "w+" - чтение и запись; в обоих случаях файл создаётся или очищается существующий;
  • "a" - дозапись в конец существующего файла; "a+" - дозапись и чтение; файл создаётся.
 
  $file = fopen("file.txt","w");
  if(file){
     fputs($file, "file id = $file\n");
     fclose($file);
  }
  else
     echo("Ошибка открытия файла");

Чтение полей xml-файла

 
<clients> 
<client> <name>John </name> <account>222</account> </client> 
<client> <name>Smith</name> <account>123</account> </client> 
</clients> 

осуществляется таким образом:

 
   $clients = simplexml_load_file('clients.xml'); 
   foreach ($clients->client as $client)
      print "$client->name has account number $client->account <br>"; 

Чтение csv-файла в массив:

 
   $file =  fopen ("rps.csv","r");      
   if($file){                            // читаем файл построчно, разбивая на поля
      while ($data = fgetcsv($file,1024,","))
         if(count($data))
            $table[] = $data;
      fclose ($file);
   }
   
   foreach ($table as $ln)                // выводим поля файла
      echo "$ln[0] $ln[1] $ln[2]\n";
      
   $table[] = Array("aaa", "bbb", 8 );    // добавляем к таблице строку
   $file = fopen('rps.csv', 'w');
   if($file){
      foreach($table as $ln)              // записываем всю строку
              fputcsv($file, $ln); 
           fclose($file);
   }

Некоторые функции

  • чтение:
    • string fgets( int file, int len); - прочитать строку длинной не более len-1 символов до конца строки или файла. При достижении конца файла возвращает пустую строку.
    • string fread( int file, int len ) - прочитать строку длинной len символов
    • string fgetss(int file, int len [, string allowable_tags]); - чтения строки с удалением из неё тегов HTML. В строке allowable_tags перечень тегов через запятую, которые не надо отбрасывать
    • array fgetcsv ( int file, int length, char delim) - чтения файлов с расширением *.csv
    • fpassthru($file); - распечатать содержимое файла
    • readfile ("file.txt"); - тоже, но передаётся строка с его именем
  • запись:
    • int fputs ( int file, string str [, int length ]) - записать строку

Cookies

Cookies должны устанавливаться до первого вывода информации в браузер (например, оперетором echo или выводом какой-либо функции)! Нельзя даже ставить пустую линию между двумя последовательными php блоками, использующие куки.

<?php 
   // Устанавливаем Cookie на один час после установки:
   if( SetCookie("My_Cookie","Value",time()+3600) )
      echo "<h3>Cookies успешно установлены!</h3>";
   echo @$_COOKIE['My_Cookie']; // При следующем запросе скрипта выводит 'Value':
?>

Пример, как построить счетчик числа загрузок страницы с помощью Cookies:

<?php
   // Проверяем, был ли уже установлен Cookie 'Mortal',
   if (isset($_COOKIE['Mortal'])) $cnt=$_COOKIE['Mortal']+1; else $cnt=0;
   // Устанавливаем Cookie 'Mortal' зо значением счетчика со временем "жизни" до 18/07/29,
   setcookie("Mortal",$cnt,0x6FFFFFFF);
   // Выводим число посещений (загрузок) этой страницы:
   echo "<p>Вы посещали эту страницу <b>".$cnt."</b> раз</p>";
?>

Можно установить массив Cookies:

<?php
   // Устанавливаем массив Cookies:
   setcookie("cookie[1]", "Первый");   
   setcookie("cookie[2]", "Второй");

   // После перезагрузки страницы мы отобразим массив Cookies 'cookie':
   if (isset($_COOKIE['cookie'])) {
       foreach ($_COOKIE['cookie'] as $name => $value)
          echo "$name : $value <br>";
   }
?>

Библиотеки

Конструкция require имя_файла; позволяет собирать сценарии PHP из нескольких отдельных файлов, которые могут быть как html-страницами, так и php-скриптами. При запуске программы интерпретатор просто заменит инструкцию на содержимое файла имя_файлаперед запуском программы (в отличие от include).

Конструкция include имя_файла; позволяет включать файлы в код PHP скрипта во время выполнения сценария. Дойдя до include, PHP прекращает транслировать сценарий и переключается на указанный в include файл. При этом быстродействие сценария снижается (при большом количестве include файлов). С require таких проблем нет, поскольку файлы с помощью require включаются до выполнения сценария, то есть на момент трансляции файл уже включен в сценарий.

Целесообразнее использовать конструкцию require там, где не требуется динамическое включение файлов в сценарий, а конструкцию include использовать только с целью динамического включения файлов в код PHP скрипта.

Примеры

Ссылки

  • php.su - справочник и учебник по PHP
  • wipmania.com - определение страны, провайдера по ip адресу, иконки всех флагов

См.также