→

PHP программирование →  Чем PHP 5.4 отличается от PHP 5.x

Добавлена поддержка трейтов.


Начиная с версии 5.4.0 PHP вводит инструментарий для повторного использования кода, называемый трейтом.

Трейт (англ. trait) — это механизм обеспечения повторного использования кода в языках с поддержкой единого наследования, таких как PHP. Трейт предназначен для уменьшения некоторых ограничений единого наследования, позволяя разработчику повторно использовать наборы методов свободно, в нескольких независимых классах и реализованных с использованием разных архитектур построения классов. Семантика комбинации трейтов и классов определена таким образом, чтобы снизить уровень сложности, а также избежать типичных проблем, связанных с множественным наследованием и c т.н. mixins.

Трейт очень похож на класс, но предназначен для групирования функционала хорошо структурированым и последовательным образом. Невозможно создать самостоятельный экземпляр трейта. Это дополнение к обычному наследованию и позволяет сделать горизонтальную композицию поведения, то есть применение членов класса без необходимости наследования.

Пример #1 Пример использования трейта

<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>
 


Добавлен короткий синтаксис объявления массивов.


Например,
$a = [1, 2, 3, 4]; или $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];


Добавлена возможность разыменования массивов, возвращаемых функциями.


Например:
foo()[0]
.

Классы для создания анонимных функций


(Closures) теперь поддерживают $this.
Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определенных имен. Они наиболее полезны в качестве значений callback-параметров, но также могут иметь и множество других применений.

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// выведет helloWorld
?>


Оператор <?= теперь доступен всегда, несмотря на значение php.ini опции short_open_tag.



Добавлена возможность получения доступа к члену класса при создании экземпляра.


Например:
(new Foo)->bar()


Теперь поддерживается такой синтаксис:

Class::{expr}()

Добавлен бинарный формат задания чисел


например:
0b001001101

Улучшены сообщения об ошибках разбора и предупреждения о несовместимых аргументах.


Расширение по работе с сессиями теперь может отслеживать процесс загрузки файлов.


Встроенный веб-сервер в режиме командной строки для разработчиков.

0

Блог им. seo →  Ура, обновление ImageCMS до версии 2.5.0

Представляю Вашему вниманию новую версию ImageCMS 2.5.0.

Изменения коснулись как ядра системы, так и модулей ImageCMS и ImageCMS Shop.

Во-первых: система полностью переведена на новую версию CodeIgniter 2.0.


( Читать дальше )
-1
seo

Блог им. seo →  Обновление ImageCMS до версии 2.1.6

С радостью представляем Вашему вниманию новую версию ImageCMS 2.1.6.
В большинстве изменения коснулись модуля ImageCMS Shop:

— Сделана возможность оплаты популярными способами: webmoney, robokassa, автоматическое создание счета для оплаты через СберБанк и ОщадБанк
— Создан модуль скидок и возможность применять скидки для различных категорий, товаров.
— Сделана возможность вводить «старую цену».
— Для ImageCMS в целом добавлен простой модуль голосования.


( Читать дальше )
-1
seo

Блог им. seo →  Бесплатная Open-Source CMS и движок интернет магазина от ImageCMS 2.1.0

ImageCMS — бесплатная Open-Source CMS для разработки любой сложности сайтов и интернет магазинов.
В жизни ImageCMS произошло грандиозное обновление, над которым проводилась работа последние четыре месяца– запущено версию ImageCMS 2.1.0.
В рамках работы над новой версией были проделаны следующие изменения:
  • Усовершенствован администраторский интерфейс, в частности дизайн, а также элементы навигации.

  • Осуществлена поддержка php 5.3

  • А также добавлено много других возможностей и исправлено более 12 багов.


Со всем списком изменений можете ознакомиться на странице: http://www.imagecms.net/blog/changelog/versiia_210
Кроме этого мы сделали новый базовый шаблон для ImageCMS, в котором значительно расширили функционал и сделали новый более «красивый» дизайн.


( Читать дальше )
-1
seo

Говнокод →  Польский говнокод

if($rs===false){
        $rs='false';
}
elseif($rs=="dup"){
        $rs = "dup";
}
elseif($rs=="bad_link"){
        $rs = "bad_link";
}
else{
        $rs = 'true';
}
3

PHP программирование →  Асинхронность с помощью fastcgi_finish_request()

При оптимизации приложения важно не забывать о том, что оптимизируем мы прежде всего для клиента. Сайт, который работает медленно, это всегда неудобно и плохо.

Главный критерий оптимизации для клиента — это скорость ответа (т.е. время, за которое Web сервер отвечает на запрос). Если не брать во внимание клиентскую оптимизацию, есть ряд практик, позволяющих быстрее генерировать ответ клиенту (по сути без оптимизации внутренностей).

Одна из распространенных практик — это переводить необязательную для ответа часть логики в асинхронную обработку. Для этой задачи применяются очереди сообщений.

Если Вы счастливый обладатель связки PHP + PHP-FPM, то существует более простой (хотя и несколько ограниченный) подход для реализации асинхронности. После сборки патча php-fpm, Вам станет доступна функция:

fastcgi_finish_request();

После ее вызова из скрипта, php-fpm получает сигнал о завершении запроса (т.е. отправляет ответ Web серверу), но сам скрипт не завершается. Т.е. вся логика, которая находится после вызова этой функции будет выполнена на фоне.

Для примера рассмотрим задачу отправки письма (зачастую, весьма медленный процесс):

$to = $_POST['to'];
$body = $_POST['body'];
$subject = $_POST['subject'];

if ( $to && $body && $subject )
{
        echo 'Ваше письмо успешно отправлено';
        # После этой инструкции посетителю уйдет ответ
        fastcgi_finish_request();
        # Сама отправка будет выполнена на фоне
        mail($to, $subject, $body);
}
else
{
        echo 'Вы не ввели все необходимые данные';
}

Это самый простой пример, но, как видно, затраты на внедрение этого ощутимого улучшения минимальны. Другие примеры: загрузка фото с последующим ресайзингом, загрузка видео с последующей конвертацией, отправка сообщения всем друзьям (либо просто нескольким людям) и т.п.

Вам приходилось пользоваться fastcgi_finish_request(), и если да, то в каких случаях?
1
2

PHP программирование →  Переход от php4 к php5 (Статические члены класса. Исключения, определённые пользователем. Пространства имен)

Начало:
http://php5.com.ua/blog/php-programming/133.html
http://php5.com.ua/blog/php-programming/134.html
http://php5.com.ua/blog/php-programming/135.html

Статические члены класса


Статические члены и статические методы могут использоваться для реализации того, что в ООП называется «методы класса» и «переменные класса».

«Статическим методом класса» называют метод, который можно вызвать без создания объекта этого класса.
«Переменной класса» называют переменную, к которой можно обратиться без создания объекта этого класса (и метод доступа при этом не потребуется).

Пример: методы класса и переменные класса
<?php
class calculator {
  static public $pi = 3.14151692;

  static public function add($x,$y) {
    return $x + $y;
  }
}

$s = calculator::$pi;
$result = calculator::add(3,7);
print("$result");
?>

Исключения — это общепринятый подход к обработке ошибок и неожиданных ситуаций в таких языках как Java и C++; в PHP5 перехват исключений реализован с помощью пары «try» — «catch».

Пример: Исключения
<?php class foo {

  function divide($x,$y) {
    if($y==0) throw new Exception("деление на ноль недопустимо");
    return $x/$y;
  }
}

$x = new foo();

try {
  $x->divide(3,0);  
} catch (Exception $e) {
    echo $e->getMessage();
    echo "\n<br />\n";
    // Какие-нибудь драконовские меры
}
?>


Как вы видите, «try» используется для обозначения блока, в котором находятся ошибки, обрабатываемые оператором «catch», стоящим в конце блока. В блоке «catch» вам нужно реализовать вашу собственную политику обработки ошибок. В итоге получаем удобочитаемый код и всего один блок обработки ошибок.

Исключения, определённые пользователем


Для обработки непредвиденных проблем в ваших программах вы можете определить ваши собственные исключения. Всё, что вам нужно — это просто дополнить (extend) класс Exception, определив конструктор класса и метод getMessage.

Пример: Исключения, определённые пользователем

<?php
class WeirdProblem extends Exception {

   private $data;

   function WeirdProblem($data) {
        parent::exception();
        $this->data = $data;
    }

    function getMessage() {
        return $this->data . " вызвало какое-то странное исключение!";
    }
}
?>


Потом, для возбуждения определённого вами исключения используйте конструкцию throw new WeirdProblem($foo); если исключение происходит внутри блока try{}, то PHP5 передаст управление в «catch»-блок для обработки.

Пространства имён


В целях удобства классы и функции могут быть сгруппированы в пространства имён (namespaces).

Примечение: разработчики отказались от поддрежки этой возможности.

Пример: Пространство имён
<?php
namespace Math {

  class Complex {
    //...код...
    function __construct() {
      print("привет");
    }
  }
}

$m = new Math::Complex();
?>

Обратите внимание на синтаксис использования именного пространства для обозначения класса, объект которого мы создаём. Пример практического применения: создание одноимённых классов в разных именных пространствах; при этом классы делают отличную друг от друга работу (имея одинаковый интерфейс).
1
1

PHP программирование →  Переход от php4 к php5 ( Абстрактные классы. __set и __get)

Начало:
http://php5.com.ua/blog/php-programming/133.html
http://php5.com.ua/blog/php-programming/134.html

Абстрактные классы


Абстрактным называется класс, который может использоваться только как базовый (то есть создавать объекты этого класса нельзя). Как и в любом нормальном базовом классе, в абстрактном классе вы можете определять методы и переменные.

В абстрактном классе также можно определять абстрактные методы: методы, которые не реализованы в абстрактном классе, но которые обязательно должны быть реализованы в производных классах.

Пример: Абстрактные классы
<?php
abstract class foo {
  protected $x;

  abstract function display();

  function setX($x) {
    $this->x = $x;
  }
}


class foo2 extends foo {
  function display() {
    // Код
  }
}
?>

__call

С PHP5 вы можете реализовать в классе специальный метод __call(), как метод для «отлова» всех нереализованных в данном классе методов. Метод __call (если он определён) вызывается при попытке вызвать недоступный или несуществующий метод.

Пример: __call
<?php
class foo {

  function __call($name,$arguments) {
    print("Вызывали? Я -  $name!");
  }
}

$x = new foo();
$x->doStuff();
$x->fancy_stuff();
?>

Этот специальный метод может быть использован для реализации перегрузки методов: вы можете исследовать полученные аргументы и в зависимости от результата вызвать подходящий для данного случая закрытый метод, например:

Пример: Перегрузка методов с помощью __call
<?php
class Magic {

  function __call($name,$arguments) {
    if($name=='foo') {
      if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
      if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
    }
  }

  private function foo_for_int($x) {
    print("у, смотрите, целое число!");
  }

  private function foo_for_string($x) {
    print("у, смотрите, строка!");
  }
}

$x = new Magic();
$x->foo(3);
$x->foo("3");
?>

__set и __get


Но это ещё не всё, теперь вы можете определить методы __set и __get для «отлова» всех попыток изменения или доступа к неопределённым (или недоступным) переменным.

Пример: __set и __get
<?php
class foo {

  function __set($name,$val) {
    print("Привет, вы попытались присвоить значение $val переменной $name");
  }

  function __get($name) {
    print("Привет, вы пытались обратиться к $name");
  }
}

$x = new foo();
$x->bar = 3;
print($x->winky_winky);
?>

В PHP5 вы сможете «сказать» методу, что он должен получить в качестве аргумента объект определённого типа.

Пример: указание типов
<?php
class foo {
  // код ...
}

class bar {
  public function process_a_foo(foo $foo) {
   // Ещё какой-нибудь код
  }
}

$b = new bar();
$f = new foo();
$b->process_a_foo($f);
?>

Как вы заметили, перед именем аргумента теперь можно поставить имя его класса, и таким образом PHP5 определит, что переменная $foo должна быть класса foo.

Продолжение:
http://php5.com.ua/blog/php-programming/146.html
2

PHP программирование →  Переход от php4 к php5 (Дескрипторы Private, Public и Protected. Интерфейсы)

Начало здесь: http://php5.com.ua/blog/php-programming/133.html

Дескрипторы Private, Public и Protected


В PHP4 все методы и переменные внутри объекта были доступны извне, другими словами все методы и переменные всегда были открытыми. В PHP5 вводится три дескриптора для осуществления контроля над доступом к переменным и методам: Public, Protected и Private.

* Public (открытый): Метод/переменная доступны из любого места в коде.
* Private (закрытый): Закрытые методы или переменные доступны только внутри класса.
* Protected (защищённый): Защищённые методы или переменные доступны только внутри класса, где они были объявлены и из его производных классов.

Пример: Public, protected and private

<?php
class foo {
  private $x;

  public function public_foo() {
    print("Это открытый метод");
  }

  protected function protected_foo() {
    $this->private_foo(); //Всё правильно, мы можем вызывать закрытые методы, потому что мы находимся в том же классе
    print("Это защищённый метод");
  }

  private function private_foo() {
    $this->x = 3;
    print("Это закрытый метод");
  }
}

class foo2 extends foo {
  public function display() {
    $this->protected_foo();
    $this->public_foo();
    // $this->private_foo();  // Неправильно! В базовом классе метод закрыт
  }
}

$x = new foo();
$x->public_foo();
//$x->protected_foo();  //Неправильно, защищённые методы могут вызываться только из того же класса или
//его производных классов
//$x->private_foo();    //Неправильно, закрытые методы могут быть вызваны только в классе, где они были объявлены

$x2 = new foo2();
$x2->display();
?>


Совет разработчикам: Переменные класса всегда следует делать закрытыми, прямой доступ к переменным — не очень хорошая практика в ООП, лучше всего для доступа/изменения переменных класса определять специальные методы.

Интерфейсы



Как вы знаете, PHP4 поддерживает наследование классов синтаксисом «class foo extends parent». В PHP4 И в PHP5 класс может наследовать только один класс, то есть множественное наследование не поддерживается. Интерфейсом называется класс, в котором не реализуется ни один метод, определяются только названия методов и набор передаваемых им параметров. Впоследствии классы могут 'реализовывать' сколь угодно много интерфейсов, показывая тем самым, что тот или иной класс реализует методы, определённые в интерфейсе.

Пример: Интерфейсы

<?php
interface displayable {
  function display();
}

interface printable {
  function doprint();
}

class foo implements displayable,printable {
  function display() {
    // код
  }

  function doprint() {
    // код
  }
}
?>


Использование интерфейсов полезно для более удобного чтения и понимания кода: прочитав объявление класса, мы увидим, что класс реализует интерфейсы displayable и printable; это означает, что класс должен иметь методы display() и doprint(). Как эти методы реализованы — значения не имеет, главное — уже из объявления класса, вы знаете, что можете вызывать эти методы.

Продолжение:
http://php5.com.ua/blog/php-programming/135.html
http://php5.com.ua/blog/php-programming/146.html
2

PHP программирование →  Переход от php4 к php5

Переход к PHP5


Краткий обзор возможностей PHP по материалам PHP 5 beta 3.
PHP, фактически, является самым распостраненным языком для Web программирования. В достижении этого статуса он прошел множество этапов, от простого языка для Web программирования который уступал многим (php3), до сегодняшнего быстрого мощного и расширяемого (PHP4). Тем более приятно, что PHP не стоит на месте и продолжает развиваться оставаясь таким-же простым для начинающих и предоставляя все больше возможностей более квалифицированным разработчикам.

Введение

PHP, фактически, является самым распостраненным языком для Web программирования. В достижении этого статуса он прошел множество этапов, от простого языка для Web программирования который уступал многим (php3), до сегодняшнего быстрого мощного и расширяемого (PHP4). Тем более приятно, что PHP не стоит на месте и продолжает развиваться оставаясь таким-же простым для начинающих и предоставляя все больше возможностей более квалифицированным разработчикам. В предверьи выхода PHP5 появляется множество информации о улучшениях в PHP 5, включая информацию от самих разработчиков. Например, замечательная статья от одного из авторов Zend Engine — Zeev Suraski (http://phpclub.ru/detail/article/2004-01-07) и её перевод на phpclub.ru очень помогут в понимании тонкостей изменения работы с объектами. Существуют, конечно, и общие обзоры возможностей PHP5, сделанные как отечественными так и зарубежными авторами. В своем обзоре я попытался дать наиболее полное представление о изменениях в PHP5, на сколько это возможно. Эта статья также является в некотором роде «отчетом о проделанной работе», поскольку обзор каждого изменения собровождался детальным его изучением и попыткой использовать на практике.

На этом заканчиваем введение и приступаем к основной части.

Новые уровни доступа private и public

В PHP5 добавлены новые модификаторы уровня доступа для переменных классов. Как и во многих других языках программирования, они носят названия private, protected и public.

Private — самый ограниченничивающий модификатор. Private переменная класса может быть использованна только в классе, в котором объявленна. К ней невозможно обратиться из другого программного кода.

Protected — расширение области private, добавляющее к ней возможность обращаться к переменной из классов-потомков.

Public — расширяющий protected модификатор, задающий наиболее широкую область доступа. К возможности использовать переменную в классах-потомках, добавляется возможность обращаться к переменной непосредственно из другого кода. Строго говоря, public не является новой областью доступа. Ранее в PHP все переменные классов являлись public переменными.

Private переменные используются для алгоритмов, которые используются только в текущем классе и не могут быть переопределенны в классах-потомках. Protected может быть использован, когда организовывается семейство объектов, обладающих сходными алгоритмами и организованных в иерархию. Использование public переменных, обычно, не является хорошей практикой но иногда оправданно. Их можно использовать, если у класса много свойств, которые должны быть доступны всем алгоритмам, использующим этот класс.

Аналогично, private/protected/public мидификаторы применяются к методам класса. Методы, объявленные без модификатора, являются public методами.

Если метод или переменная переопределяются в классе-наследнике, то уровень доступа должен быть таким-же или выше. Например, protected метод в классе-потомке можно сделать public, но нельзя private.

Для примера рассмотрим классы NewClass и NewClass1.

class NewClass {
// new PHP5 modifiers
private $myPrivateVar = 'myPrivateVar';
protected $myProtectedVar = 'myProtectedVar';
public $myPublicVar = 'myPublicVar';
// old PHP declaration
var $myVar = 'myVar';
}

class NewClass1 extends NewClass {
function getProtectedVar() {
return $this->myProtectedVar;
}
}


NewClass содержит несколько переменных с разными областями доступа. NewClass1 используется для тестирования областей видимости, связанных с наследованием.

Создаем объекты классов:

$c = new NewClass();
$c1 = new NewClass1();


Обращаемся к переменным:
print $c->myPrivateVar;

Непосредственное обращение к private переменной приводит к ошибке.
print $c->myProtectedVar;

Непосредственное обращение к protected переменной приводит к ошибке.
print $c->myPublicVar;

Обращение к public переменной возвращает её значение.
print $c->myVar;

Обращение к переменной, объявленной в старом стиле, равносильно обращению к public переменной.
print $c1->myPrivateVar;

Private переменная не была унаследованна классом NewClass1. Обращение к ней равнозначно обращению к необъявленной переменной.
print $c1->myProtectedVar;

Protected переменная была унаследованна и непосредственное обращение к ней приводит к ошибке. Для проверки, что она была унаследованна вместе с начальным значением, можно вызвать «print $c1->getProtectedVar();».
print $c1->myPublicVar;
Public переменная была унаследованна и обращение к ней возвращает её значение.

Продолжение:
http://php5.com.ua/blog/php-programming/134.html
http://php5.com.ua/blog/php-programming/135.html
http://php5.com.ua/blog/php-programming/146.html
2
←  сюда    туда  →
1 2 3