Boroda aka Hamster (fantaseour) wrote,
Boroda aka Hamster
fantaseour

PHP 5.3 и все-все

Ветка PHP 5.3 будет выпущена в начале следующего года и порадует как минимум двумя новыми фичами – неймспейсами и поздним статическим связыванием.

Менеджеров релиза назначают нового для каждой ветки. Johannes Schlüter сменит на этом посту Ilia Alshanetsky

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

//lib_file.php
namespace VendorProject;
 
define ('LEVEL',1);
 
class 
Log 
{
  
private $text='sample'
  
public function getText()
  {
    return 
$this->text;
  }
}
 
//main_file.php
require ('lib_file.php');
import VendorProject as Universal;
 
class 
Log
{
}
 
$globalLog= new Universal::Log();
$localLog=new Log();
 
echo 
$globalLog->getText();
echo 
Universal::LEVEL;
echo 
VendorProject::LEVEL;

Позднее статическое связывание позволит статическим методам знать какой класс их вызывает.

Суть проблемы:

class {
    
public static function me() {
        echo 
__CLASS__;
    }
    
public static function test() {
        
self::me();
    }
}
class 
extends {
    
public static function me() {
        echo 
__CLASS__;
    }
}
B::test(); // A

Т.е. при вызове статического метода test в классе B, статический метод me будет вызван из класса A. Такого не происходит при нестатическом вызове. В настоящее время для борьбы с этим эффектом пользуются debug_back_trace() и на основе данных трейса делают костыль. Такой же прием используется для множественного наследования в Symfony

В новой версии можно будет делать так:

class {
  
public static function me() {
    echo 
__CLASS__;
  }
  
public static function test() {
    static::
who();
  }
}
class 
extends {
  
public static function me() {
    echo 
__CLASS__;
  }
}
B::test(); // B

Однако радоваться рано, в настоящий момент вот такая конструкция отработает совсем не так, как хотелось бы:

class Foo
{
  
//...
  
static public function test()
  {
    return static::
$some_property;
  }
  
//...
}
 
class 
Bar extends Foo
{
  static 
public function test()
  {
    
// Do some work specific to Bar
    
return parent::test();
  }
}
 
class 
Bar_Child extends Bar
{
}

Как только мы обращаемся к методу родительского класса, мы тут же теряем привязку к вызываемому классу, и метод Foo::test(); уже не сможет выдать Bar::$some_property;

То же самое и для наследников класса Bar.

Я не смотрю внимательно за беседами в интерналс, поэтому не знаю будут менять такое поведение или нет.

Ссылки:

Namespaces has PHP 5.3 (Or the other way around)
Late Static Bindings Explained
Late static binding....sorta :/

Tags: development, php
Subscribe

  • (no subject)

    Я очень люблю конференции. Они зажигают в разработчике свечечку, которую он потом бережно несет в себе через весь год! Когда-то давно, я с завистью…

  • Bing Interview

    Сходил на интервью в Microsoft. Получил известную долю удовольствия. 5 интервью одно за другим. 4 технических, одно -- HR. Интервьюверы умны,…

  • таки Bing!

    Я таки устроил в своей жизни еще одну авантюру -- послал резюме в Microsoft, когда узнал, что в августе они приедут собеседовать желающих поехать в…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 15 comments

  • (no subject)

    Я очень люблю конференции. Они зажигают в разработчике свечечку, которую он потом бережно несет в себе через весь год! Когда-то давно, я с завистью…

  • Bing Interview

    Сходил на интервью в Microsoft. Получил известную долю удовольствия. 5 интервью одно за другим. 4 технических, одно -- HR. Интервьюверы умны,…

  • таки Bing!

    Я таки устроил в своей жизни еще одну авантюру -- послал резюме в Microsoft, когда узнал, что в августе они приедут собеседовать желающих поехать в…