PHP bir işlevin bir dizi artı değişkenler geçmek nasıl?

5 Cevap php

Ben gibi bir fonksiyon prototipi var:

function do_upload( $file, $id, $type )

Ve ben bu gibi işlevi arıyorum:

$this->do_upload( $files, $id, 'article' );

Ancak, $ dosya aslında işleve geçirilir edilmektedir. Ben basit eminim ama ben ne yanlış yaptım?

EDIT:

Yani $ dosya $ _FILES benzer dosya bilgileri sadece bir dizi olduğunu ve ince geçirilir, ben işlevi de bunun bazı manipülasyon yapmak.

Ben bir kimlik görmek işlev çağrısı ben beklediğiniz önce () print_r $ ve tipi sadece bir dize ise ben, işlevi aramadan önce $ id ayarlanır.

I () print_r ya da $ id () ölürsen Ancak, ya $) onlar (boş ve var_dump hem yazın aşağıdaki döndürür:

die( var_dump( $id ) ); -> string(0) ""
die( var_dump( $type ); -> bool(false)

Sağ işlev çağrısından önce: die( var_dump( $id) ); -> string(3) "111"

Herhangi bir fikir?

ÇÖZÜM:

Herkes benzer bir sorun var bu durumda, aşağıda kabul edilen cevabı kontrol edin. Esasen ben bu mevcut yığın alanı kullanarak gibi referans $ dosyaları dizi geçmesi gerekiyordu.

Teşekkürler

5 Cevap

Ben senin aslında işlev çağrısı için yığın alanı (veya ne olursa olsun boşluk php çağrı yığınları için kullandığı) tükeniyor düşünüyorum. Referans ile $ dosya geçen deneyin. Aynı şekilde $ dosyalara sadece bir dize geçirerek deneyin ve bu geri diğer parametreleri getiriyor bakın.

"PHP bir işlevin bir dizi artı değişkenler geçmek nasıl?" Soruyu cevaplamak için

function f($x,$y){}
f(array(),$a);

Yapısı bu benzer olsa bile gerekiyordu gibi çalışır.

class a {
    function do_upload( &$file, $id, $type) {
    }
}
class b extends a {
    public function f() {
        $files = array('a','b');
        $id = "string";
        $this->do_upload($files,$id,'article');
    }
}

I söz konusu hatayı yeniden verebileceğiniz tek örnek budur. Belki birisi daha doğru olabilir?

class b extends a {
    function do_upload( &$file, $id, $type) {
        parent::do_upload($file, '', false);
    }
    public function f() {
        $files = array('a','b');
        $id = "string";
        $this->do_upload($files,$id,'article');
    }
}

Sana codeigniter başka bir göz atın öneririz

Bu aslında doğru görünüyor. İlk parametre PHP 5 (tüm nesneleri ve diziler artık varsayılan olarak başvuruya göre iletilir) olarak gerekli değildir referansla geçirilir, ama bu bir şey kırmak gerekir. Zaten & kaldırarak öneriyoruz.

Ben soru daha fazla bağlam gerektiğini düşünüyorum. Insanlar neler olduğunu anlamaya yardımcı olabilir böylece çevredeki kod daha gönderin.

Birkaç recommendations* kodunuzu ilgili:

(1) yöntem adları için alt çizgi dışında deve vaka gösterimde yerine kullanın: doUpload

Nedenleri:

  • okunabilirliği: kolayca yerel php fonksiyonlarını ayırt
  • lazyness: az yazmak, çizgi için parmaklarını kırmak istemem
  • algı: Gestalt ilkeleri, yakından birlikte ilgili şeyler tutmak

(2) yerine sadece işlevi gerekirse, mümkün olduğunca kısıtlamak ve daha sonra açmak kamu / özel / korumalı işlevini kullanın

Nedeni (McConnell itibaren, Code Complete, 2nd Edition, P251): "kolaylık" felsefesi [global değişkenler bir sürü] ve [mümkün olduğunca yerel] "entelektüel yönetilebilirlik" felsefesiyle arasındaki arasındaki fark vurgu farkından aşağı kaynar programları yazma ve onları okumak. Kapsamını maksimize gerçekten yazmak programları kolay yapmak, ancak herhangi bir rutin herhangi bir zamanda, herhangi bir değişkeni kullanabileceğiniz bir program iyi çarpanlarına rutinleri kullanan bir program daha anlamak zor olabilir. Böyle bir program, sadece bir rutin anlayamıyorum; Eğer ile bu rutin hisse global veri tüm diğer rutinleri anlamak zorunda. Bu tür programlar, okumak zor hata ayıklama zor ve değiştirmek zor.

Consquently, you should declare each variable to be visible to the smallest segment of code bunu görmek gerekiyor.

İsteğe bağlı bazı yöntem parametreleri bildirmek istiyorsanız (3), bir yanlış türü ile varsayılan değeri ayarlamak yok. $id çok büyük olasılıkla $id = '' ile dizeye koymayın bir tamsayı olacaktır. Örneğin 0 veya null için ayarlayın. (Kod okunabilirliği, yanlış şartlar öneri)

* Bir öneri bilgilerin sağlayıcı söz konusu durumun iyileştirilmesi için yardım edeceğine inandığını hangi bir bilgi

Nasıl is_array kontrol () hakkında? Ben onlar değişken kontrol, ve bir dizi değilse onlar gibi bir şey yapmak olduğu çok kod gördük:

if (!is_array($files)) }
   $f = $files;
   $files = new array();
   $files[] = $d
}

foreach( $files as $f ) {
 // whatever...
}