İç içe değişkenler için argümanlar temin edilebilir önce PHP yapıcı yürütür

4 Cevap php

Öncelikle, burada benim sorunum açıklamaya yardımcı olmak için küçük bir pasajı kodu:

<?php
class foo {

    public $title;

    __construct{

        echo "<html>\n";
        echo "<head>\n";
        echo "<title>".$this->title."</title>\n";
        echo "</head>\n";
        echo "<body>\n";

    }

    /**
    *
    * I get $title from index.php
    *
    */
    public function setTitle( $title )
    {

        $this->title = $title;

    }


    __destruct{

        echo "</body>\n";
        echo "</html>\n";

    }

}
?>

Muhtemelen bu kod, iyi bir başlık üretecek zaten fark ettik. Yah, orada bir boşluk var. :- )

Sınıf yapıcısı o {[için argüman tedarik index.php için beklemek değil, yani foo nesnenin oluşturulması idam ediliyor, çünkü bana bu aslında (ben bunu beklemiyordum bile) çok mantıklı (0)]} hangi sırayla {doldurur dize döndürür [(1)]}.

Burada ne oluyor ben gerçekten anlamak Yani, ben bu soruna almak için ne yapabilirim? Ben tampon fonksiyonları yerleşik kullanarak çıktı tamponlama ve ardından verilen başlık dize ile saklanan çıkışını değiştirerek olmalı? Herhangi bir fikir?

Gerçekten, gerçekten, gerçekten, yapıcı ve yıkıcı bu tekrarlayan kodu içeren bu yapıyı tutmak istiyorum. Onun bu işlevler her yerde çağrılacak gerekmez bu güzel. Bazı geliştiriciler bu kötü uygulama düşünebilirsiniz anlıyorum, ama ben soğukkanlı düşünüyorum çünkü ben istiyorum çünkü ben zaten bu şekilde yapmak için gidiyorum. Benim aptallık beni bilgilendirmek için son derece motive hissediyorum sürece Yani ben gerçekten bu yönüyle tavsiye aramıyorum.

Yani, benimle paylaşmak için herhangi bir tavsiye / fikir / knowlege varsa bu harika olurdu.

Ben şehrime geldi kötü domuz gribinden gizleme içinde kalmak zorunda, o nedenle acele edilmesi için gidiyorum sanırım çünkü teşekkürler, ve zaman almaya çekinmeyin!

4 Cevap

teh_noob. Dinle beni. Ben burada yazarak yaşıyorum bu sözleri. Onları söylüyorum taklit ve ağzımdan çıkan kelimeleri duymak. Hayır NO NO NO NO NO Ve hayır, ben bunu düşünüyorum ne kadar "cool" bir sıçan popo vermeyin.

Bu "yanlış" şeyler bu yaklaşım hakkında "doğru" şeyler listesine kısa olacak bu talihsiz senaryolardan biridir. Demek ki, sorunlarınızı numerous. söyleniyor, ben only some bu fikir hakkında kötü şeylerin üzerine gitmek için gidiyorum geldiğini.

İlk olarak, sadece genel olarak OOP konuşalım. Burada ne yapıyorsun hiç görmek benim en sevdiğim şey: I "dersleri ile programlama" dediğimiz. Bu bir sınıf anahtar kelime kullanıldığından, OOP kılığında yapısal programlamayı söylemektir. Bunu yapacaksın, zahmet yok. Sadece işlevlerini kullanabilirsiniz. Bu sınıf kötüye sade ve basittir.

Sınıflar nesne blueprints.Objects kapsüllenmesine kendilerini borç ve instantiation vardır. Eğer gerçekten Singleton pattern hayranı değilseniz, neden açıkça sadece bir kez örneği için tasarlanmış bir sınıf oluşturmak? Eğer söylemeden önce "Ama Peter, Singleton Desen! 1one bize yardımcı olur" aslında not all that great olduğunu anlamaya çalışın. Ayrıca, burada ne yaptığınızı bile insanların ilk etapta Singleton deseni dönüp bir neden değildir.

Ikinci alt sınıflarından konudur. Belki gelecekte bir noktada sizin siteniz için bazı açılan sayfaları isteyeceksiniz. Yoksa sadece CSS-odaklı daha vardır sadece baskı sürümleri isteyeceksiniz. Belki de bir RSS beslemesi gibi tüm HTML değil bir şey isteyeceksiniz. Şimdi ne olacak? Ne kadar bu kurucu uzayıp gidiyor other iş bu yeni sayfa türleri çalışmak için çoğaltmak zorunda olacak? Ama zaten tek tek sayfaları oluşturmak için alt sınıflara güvenerek ne başladım eğer? Şimdi mahvolduk. Tabii, geri dönüp decorator pattern kanca, ama bu sorun ilk etapta olmayan aptal sınıf tasarımı ile önlenebilir zaman neden bütün bu çalışmaları ile gidebilirsiniz?

Üçüncü olarak, ilk etapta HTML yankılanan fikirdir. Ben, orada burada bir etiket ya da üç sözcük ya da iki echo ile iyiyim. Ama büyük bir HTML parçaları için, sadece aptallık. Çıkış moduna kaçmak ve bir dize kilitli değil HTML kullanmak edep var. Sadece daha kolay düzenlemek ve aslında bir WYSIWYG onunla çalışabilir, okumayı çok arzu gerektiğidir.

Dördüncü olarak, bu kötü, badly SRP keser.

Beşinci - saçma tasarım bu tür Burada çözmeye çalışıyoruz sorunların çok türüne yol açar. Sadece çözüm yapıcınızdan yankı ifadeleri kaldırmak olduğunu bilmek istemiyorum. Bunun etrafında bir yolu var mı? Tabii. Aslında, bir daha da var. Ben bunların hiçbirini tavsiye edersiniz? Hayır, gerçekten değil.

Son olarak, başlıklarını konuşalım. Belki henüz onlar hakkında öğrenmiş değil. Belki var ve umurumda değil. Ama şimdi ne itibaren 6 ay, bir sorun üzerinde çalışıyoruz ve derin yığını içinde 10 çağrı var ve basit bir header() function çözecek gerçekleştirmek bir yöntem içinde çalışırken, ne olacak senin sorun. Belki önbellek ayarını yapmak gerekir veya elle yanıt kodu ayarlamak gerekir - ne olursa olsun. Ama ne, sen yapamazsın sanırım. Neden? Aptal yapıcı tarayıcısı oluşturulduktan milisaniye için çıktılar çünkü.

Yani, Özetle: NO! Unless your actual, ultimate goal is to see some of your very on handiwork on The Daily WTF.

Ne Uyaran yanında sunabilir? Yeni bir yöne belki parçası? Peki, hata ayıklama çıktısı iyi inşa edilmiş sistemlerde yeterince zor, bu yüzden örtülü yapar ayak kendinizi çekim tarafından başlatılmaz. Sistem tüm çıkış olmalıdır explicit. Eğer sınıf bir "sayfa" türünü yapmak istiyorsanız, bu iyi. Sadece that. gibi yapmayın

class foo
{
    protected $title;
    protected $headers;

    public function setTitle( $title )
    {
        $this->title = $title;
    }

    public function addHeader( $header )
    {
        $this->headers[] = $header;
    }

    public function sendHeaders()
    {
        foreach ( $this->headers as $header )
        {
            header( $header );
        }
    }

    public function printPageHeader()
    {
        $this->sendHeaders();
        ?>
            <html>
                <head>
                    <title><?php echo $this->title; ?></title>
                </head>
                <body>
        <?php
    }

    public function printPageFooter()
    {
        ?>
                </body>
            </html>
        <?php
    }

    public function printPage()
    {
        $this->printPageHeader();
        $this->printPageFooter();
    }
}

$p = new foo;
$p->setTitle( 'Just Testing' );
$p->addHeader( 'Cache-control: no-cache' );
$p->printPage();

Sen yıkıcı tüm baskı yapabilirdi. Tüm değişkenler olduğu biliniyor. Ancak (gibi kendinizi dedi) ben bu gerçekten kötü bir uygulama olduğunu düşünüyorum. Ben (yine :) yeterli zaman var) view / template dosyaları tür kullanarak öneririm.

Yapıcı bir argüman olarak başlık geçebileceği?

schnalle: this is bad practice. this is madness.
the_noob: madness ...?
the_noob: (shouts) THIS ... IS ... LITTLEFRAMEWORKIMBUILDING!
the_noob: (kicks separation of code and presentation down the well)

ben gerçekten ne yapmak istediğinizi olsun, ama sadece kurucusuna bir parametre olarak başlık geçemiyor ...

<?php

class Title {
    public function __construct($title) {

        echo '<html><head><title>' . htmlspecialchars($title) . '</title></head><body>';
    }

    public function __destruct() {
        echo '</body></html>';
    }
}

?>

Eğer gerçekten bir şey nesneleri yazdırmak istiyorsanız, ben sihirli __ toString () yöntemini önermek, bu yüzden olabildiğince sade echo nesne olur. ama html etiketleri için ... hala kullanışlı değildir.

i çerçeve ile size iyi şanslar diliyorum, ama bir dahi (not likely) ya da aynı hataları yapan bir adam (neredeyse) her acemi yaptım (MVC önce geldi) ya konum.

edit: i can't help you. you want direct output when the object is created, but need to get data into the object before it is created. so you try to workaround something ugly in making it even uglier. it just doesn't work that way!
you're trying to build a new, better kind of car by attaching wheels to a living donkey, then complain because it somehow didn't work out as you expected (donkey on wheels! wheooo!), and now you ask the community how to attach taillights in a way that makes the donkey/car go faster.