Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

12. 9. 2008 Zend Framework

Bude někdy Zend Framework podporovat namespaces?

Před nedávnou dobou byla uvedena verze 1.6 Zend Frameworku, o které se ale teď zmiňovat nechci. Ještě předtím proběhla na blogu jednoho z vývojářů frameworku - Matthew Weier O'Phinneyho zpráva o tom, že ve mezi vývojáři Zend Frameworku se začíná diskutovat o podpoře jmenných prostorů, které jsou nově v php 5.3. Nic není úplně jisté, ale určitá možnost se tu rýsuje a právě Matthew se na svém blogu zmiňuje o tom, jak by to mohlo eventuelně vypadat.

I takové základní balíčky jako Zend_Controller obsahují třídy s poměrně krkolomnými názvy, pak to vypadá nějak takto

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');

Mnohem elegantnější zápis

$viewRenderer = HelperBroker::getStaticHelper('viewRenderer');

je určitě nasnadě. Ale jak na to. Aktuálně se v Zend Frameworku používá jmenná konvence taková, že namespaces se oddělují podtržítkem, to by ještě šlo, ale horší to je s abstraktními třídami a rozhraními. Tam platí konvence označovat abstraktní třídy slovem Abstract a rozhraní slovem Interface.

  • Zend_Controller_Request_Abstract
  • Zend_View_Interface

Tahle konvence je dobrá, pokud se potřebujete na serveru zorientovat v kódu přes utility jako grep nebo find, ale ve spojení s namespaces nefungují.

namespace Zend::Controller::Request
 
class Http extends Abstract
{
    // ...
}

Podobně pro interface. Problém je v tom, že abstract a interface jsou rezervovaná slova v PHP. Je několik možností, jak to obejít. Jazyky jako Python a C# uvozují názvy interfaců velkým písmenem I a podobně pro abstraktní třídy používat A.

namespace Zend::Controller::Request
class Http extends ARequest
{
    // ...
}
 
a pro abstraktní třídy
 
namespace Zend::View
abstract class AView implements IView
{
    // ...
}

Další věc, kterou to ovlivní, bude autoloading, zejména se jedná o Exceptions.

namespace Foo::Bar
 
class Baz
{
    public function status()
    {
        throw new Exception("This isn't what you think it is");
    }
}

Tady se nepoužije Foo::Bar::Exception, ale normální standardní Exception. Bude se muset použít klíčového slova namespace.

namespace Foo::Bar
 
class Baz
{
    public function status()
    {
        throw new namespace::Exception("This is exactly what you think it is");
    }
}

I tohle ale přináší problémy, např. právě třída Zend_Controller_Action by se pak stala Zend::Controller::AAction, hm nic moc. Dále je tu např. problém s top level třídami jako Zend_View apod. Funkcionalita komponenty by se měla nacházet pod stejným namespacem, takže pak by to vypadalo na Zend::View::View. Problémů je evidentně více jak dost, viz. docela bohatá diskuze pod originálním článkem. Jestli se vůbec někdy namespaces do Zend Frameworku dostanou, tak to nebude určitě dříve jak s verzí 2.0, protože jen u major verze lze dělat zpětně nekompatibilní změny.


Komentáře (0)

Komentáře jsou uzavřeny.