PHP bir nesne, bir özellik veya yöntem bir yöntem çağrısı zorlamak nasıl?

6 Cevap php

Benim View (Zend_View kullanarak yani görünümü bir nesne), bu yüzden gibi şablonu doldurmak için özellikleri ve yöntemleri nesne çağrı yapmak:

<?= $this->user->name ?> // Outputs John Doe
<br/>
<?= $this->user->getCompany()->name ?> // Outputs Acme
<br/>
<?= $this->method() ?> // Outputs foobar

('Kullanıcı' gibi) tüm emlak istekleri __ get geçmesi, böylece bunu yaparsanız () ben son Çıktılanan değer bir yöntem çağrısı zorlayabilir böylece ben daha sonraki aramaları yakalamak herhangi bir yolu var mı? Örneğin bu yüzden çıktı otomatik kaçışa yapabilirdi.

Ben hemen şimdi gördüğünüz gibi, ben de bu veritabanına gider olarak girdi kaçmak veya Smarty yapar, ya da çıktısı önce kaçan zorlamak için doğrudan kontrolü vardır, böylece View nesnesi için her bir değişken atama geçmek gibi derlenmiş şablonlar kullanmak zorunda Veri.

6 Cevap

Bir dekoratör kullanabilirsiniz. Bu basitleştirilmiş örneğe bakın:

class ViewObject_Decorator
{
    protected $_decoratedObject;

    protected $_view;

    public function __construct( $object, Zend_View view )
    {
        $this->_decoratedObject = $object;
        $this->_view = $view;
    }

    public function __get( $property )
    {
        return $this->_view->escape( $this->_decoratedObject->$property );
    }

    /*
        maybe implement __call to proxy to decoratedObject methods, etc...
    */
}

Sonra (? Bu bir Zend_View yöntemdir küstah) önerdiğiniz __get yöntemi gibi bir şey olurdu:

public function __get( $property )
{
    // decorate the requested object, and send the view along with it.
    return new ViewObject_Decorator( $this->$property, $this );
}

Ben __ get () 'ile' döndürülen değer gitmek yapamazsınız çünkü No Thats söyleyerek başladı, ancak düşünme sonra etrafında olsun fark etti. Şahsen ben verimsiz olacağını düşünüyorum ve aynı zamanda kaçan $ olmadan adını alma gibi başka sorunlara neden olur.

Bunu yapmak için kullanmanız gereken __ her sınıfta ($ var) almak ve sonra kaçan sonra değişken döndürür.

ama ben şahsen kullanmak muhtemelen çok savurgan

<?= $this->user->escaped_name() ?>

şirketi ile temsil kullanıcı ve sınıf için sınıfta

__get($var){ 
  if ($var == 'name')
     return escape($this->name);
}

Bu sadece bir örnektir ve $ isim bir kamu dışı üyesidir varsayar. diziye bir dizi uygun indeksleme onun bir unsuru örneğin gerekli olması durumunda:

return escape($this->data['name']);

NB: Ben zend_views bilgim yok ama herhangi bir fark olmaz varsayalım

DC

Eğer Zend_View_Abstract::addFilterPath() ve Zend_View_Abstract::addFilter() kullanarak denedin mi?

Bkz Output Filters in Zend_View

Sen görünüm nesnesi genişletmek ve sonra gerektiği gibi tüm çıkış kaçmak için __ get () yöntemini geçersiz olabilir.

Sen kullanabilirsiniz:

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView(new My_View());

oluşturmak birine görünüm nesneyi değiştirmek için.

Manuel yolu doğrudan böyle şablonu kaçış () görünüm yardımcı kullanmaktır:

<?= $this->escape($this->user->name) ?> // Outputs John Doe
<br/>
<?= $this->escape($this->user->getCompany()->name) ?> // Outputs Acme
<br/>
<?= $this->escape($this->method()) ?> // Outputs foobar

Otomatikleştirmek için en kolay yolu, bir dere sarıcı kullanmaktır. Zend Framework uzun etiketleri kısa etiketleri dönüşüm otomatikleştirmek için kullanılan Zend_View_Stream, hangi sağlar. Bu kullanılarak etkindir:

$view->setUseStreamWrapper(true);

Otomatik <?= herhangi kullanımını kaçmak için bunu genişletmek gerekir. Sargı içinde kullanmak için kod şöyle bir şey:

$find = '/<?=[ ]*([^;>]*?|[^;?]*?)[; ]*?>/';
$replace = "<?php echo $this->escape($1); ?>";
$this->data = preg_replace($find, $replace, $this->data);

Açıkçası, bir akış şemasını kullanarak da bazı performans etkileri vardır.

Burada fazla ayrıntı:

PHPTAL sizin view olarak kullanın.

Varsayılan olarak her şeyi (tüm neccessary htmlspecialchars() çağrılar otomatik olarak eklenecek olan PHP şablonlar derler) kaçar.

${this/user/getCompany/name} <!-- it's safe! -->