PHP: Bir sınıfın işlevleri Passing

5 Cevap

Ben bir sınıf yaptı. Ben girdi olarak bunu bazı nesneleri (çoğunlukla retreived veritabanı satırları) vermek ve göstermek zorundadır hangi alanların bunu söylemek, ve ben istediğiniz düğmeleri. Sonra çok güzel bir html tablo işler! Oldukça güzel, ben düşünüyorum.

$ot = new ObjectTable();
$ot->objects = $some_objects;
$ot->fields = array('id','name','description','image');
$ot->buttons = array('edit','delete');
$ot->render();

Ancak, ben de onu gösterir verileri manipüle edebilmek istiyorum. Örneğin, ben 'açıklaması' alanını kesecek edebilmek istiyorum. Veya (yerine metin olarak 'Picture.jpg' arasında) bir resim üzerlerine görüntülemek için. Ben sınıfa bu fonksiyonları geçmek nasıl bilmiyorum. Belki bir şey gibi:

$ot->functions = array(null,null,'truncate','thumbnail');

Ama sonra bazı gerçek kodu, ya da nasıl parametrelerini geçmek çalıştırmak için şu dizeleri dönüştürmek için nasıl bilmiyorum.

İstediğimi yapmak için güzel bir yolu olmalı. Nasıl?

5 Cevap

question bu kontrol ve cevap:

As of PHP5.3 you could use closures or functors to pass methods around. Prior to that, you could write an anonymous function with create_function(), but that is rather awkward.

Ama ne ulaşmak için çalışıyoruz iyi olsa Oluşturucuya Filtre Nesneleri ileterek çözüldü. Tüm filtreler aynı yöntemi kullanmanız gerekir, böylece, örneğin, bir Strateji Desen şekilde kullanabilirsiniz İlk bir arayüz yazmak:

interface Filter
{
    public function filter($value);
}

Sonra filtreleri arabirimini uygulayan yazmak

class TruncateFilter implements Filter
{
    protected $_maxLength;
    public function __construct($maxLength = 50)
    {
        $this->_maxLength = (int) $maxLength;
    }
    public function filter($value)
    {
        return substr(0, $this->_maxLength, $value) . '…';
    }
}

Lütfen ObjectTable filtreleri kabul etmek için bir yöntem vermek

public function addFilter($field, Filter $filter)
{
    if(in_array($field, $this->fields)) {
        $this->_filters[$field][] = $filter;
    }
    return $this;
}

Ve sizin ObjectTable örnekleme, kullanım yaptığınızda

$ot = new ObjectTable();
$ot->objects = $some_objects;
$ot->fields = array('id','name','description','image');
$ot->addFilter('description', new TruncateFilter)
   ->addFilter('name', new TruncateFilter(10))
   ->addFilter('image', new ThumbnailFilter);

Sonra render () yöntemi render vardır alanları için belirlenmiş herhangi filtreler olup olmadığını kontrol edin ve onlara) yöntemi (filtre aramak için değiştirin.

public function render()
{
    foreach($this->fields as $field) {
        $fieldValue = // get field value somehow
        if(isset($this->filters[$field])) {
            foreach($this->filters[$field] as $filter) {
               $fieldValue = $filter->filter($fieldValue)
            }
        }
        // render filtered value
    }
}

Bu şekilde sonsuz filtreleri ekleyebilirsiniz.

$functions = array(null,null,'truncate','thumbnail');
$function_1 = $functions[3];
$my_string = 'string to truncate';

$ Result = call_user_func ($ işlevleri [2], $ my_string);

Eğer birden fazla parametre geçmek istiyorsanız, bunun yerine call_user_func_array kullanın.

Ayrıca adını temsil eden bir dize dayalı bir işlevi çağırmak için izin veren, call_user_func keşfetmek isteyebilirsiniz.

Sen create_function() arıyoruz.

Ancak, yürütme üzerinde işlevleri oluşturmak ve bir sınıf ekleyerek bana doğru gelmiyor. Çok hızlı bir şekilde bakım kabus haline olasıdır. Ne istediğinizi elde etmek için daha iyi yollar vardır. Manipülasyon ne tür olacağını verilerine için fonksiyonlar? Nasıl bir "araç" sınıfında saklayarak ve gerektiğinde tablo nesnesi ile bu bağlanma hakkında?