PHP منشئ ينفذ من قبل الحجج متداخلة المتغيرات يمكن توفيره

StackOverflow https://stackoverflow.com/questions/805404

  •  03-07-2019
  •  | 
  •  

سؤال

أول الأشياء أولا, هنا قليلا مقتطف رمز للمساعدة في شرح مشكلتي:

<?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";

    }

}
?>

ربما كنت قد لاحظت بالفعل أن هذا الرمز سوف تنتج عنوان حسنا .نعم ، هناك مساحة فارغة هناك. :- )

بالنسبة لي هذا الواقع يجعل الشعور بالكمال (حتى لو لم أكن أتوقع ذلك) لأن منشئ الفئة يجري تنفيذها على إنشاء فو كائن بمعنى أنه لا ننتظر index.php توريد حجة setTitle() والتي بدورها ترجع السلسلة التي تملأ $this->title.

لذا إذا كنت حقا فهم ما يجري هنا ، ماذا يمكنني أن أفعل لحل هذه المشكلة ؟ يجب أن يكون التخزين المؤقت الإخراج باستخدام المدمج في المخزن المؤقت الوظائف ، ومن ثم تعديل تخزين الناتج مع الموردة عنوان السلسلة ؟ أي أفكار ؟

أنا حقا حقا حقا ترغب في الحفاظ على هذا الهيكل حيث البناء والمدمر تحتوي على هذه البرمجية المتكررة.لطيفة أن هذه المهام لا يجب أن يسمى في أي مكان.أنا أفهم أن بعض المطورين قد تنظر في هذه الممارسة السيئة, ولكن انا ذاهب الى أن تفعل ذلك بهذه الطريقة على أي حال لأنني أريد ذلك لأنني أعتقد بارد.لذلك أنا حقا لا أبحث عن النصيحة في هذا الجانب, إلا إذا كنت تشعر للغاية دوافع يبلغني على الغباء.

لذا إذا كان لديك أي نصيحة/أفكار/المعرفة لتبادل معي من شأنها أن تكون كبيرة.

شكرا وتتردد أن تأخذ الوقت الخاص بك لأنني اعتقد انني سوف تضطر إلى البقاء داخل الاختباء من شر انفلونزا الخنازير التي قد تأتي إلى بلدي المدينة, لذلك لا تتسرع!

هل كانت مفيدة؟

المحلول

teh_noob.الاستماع إلى لي.هذه الكلمات التي أنا الكتابة هنا.تظاهر أقوله لهم ، وسماع الكلمات التي تخرج من فمي.لا. لا لا لا لا لا! و لا تأبه بعقب كيف "بارد" كنت اعتقد انه هو.

هذا هو واحد من تلك المؤسف سيناريوهات حيث سيكون أقصر إلى قائمة "الحق" الأشياء عن هذا النهج أن "الخطأ" الأشياء.وهذا هو القول ، مشاكلك عديدة. أن يقال, أنا ذاهب للذهاب على فقط بعض من الأشياء التي هي سيئة عن هذه الفكرة.

أولا, دعونا نناقش OOP بشكل عام.ما تفعله هنا هو الأقل بلدي الشيء المفضل أن ترى أي وقت مضى:ما أسميه "البرمجة مع الطبقات".وهذا هو القول ، البرمجة المهيكلة في ستار OOP لأن فئة تم استخدام الكلمة الأساسية.إذا كنت لن تفعل هذا, لا تهتم.مجرد استخدام وظائف.هذا هو فئة الاعتداء سهل وبسيط.

دروس الكائن المخططات.الكائنات تصلح التغليف ، مثيل.إلا إذا كنت حقا من محبي المفرد النمط, لماذا خلق فئة من الواضح أنها تهدف إلى إنشاء مثيل مرة واحدة فقط ؟ و قبل أن تقول "لكن" بيتر " نمط سينغلتون يساعدنا!!!1one" نحاول أن نفهم أنه في الواقع ليس كل هذا عظيم.إلى جانب ما تفعله هنا ليس سببا الناس تتحول إلى نمط سينغلتون في المقام الأول.

الثاني هو موضوع فرعية.ربما في مرحلة ما في المستقبل سوف تحتاج بعض الصفحات المنبثقة على موقع الويب الخاص بك.أو كنت تريد طباعة فقط الإصدارات التي هي أكثر من مجرد CSS يحركها.ربما عليك حتى تريد شيئا غير HTML على الإطلاق مثل تغذية RSS.ماذا الآن ؟ كم أخرى العمل الذي يجري في هذه منشئ هل سوف تضطر إلى تكرار هذه صفحة جديدة من أنواع العمل ؟ ولكن ما إذا كنت قد بدأت بالفعل الاعتماد على الفئات الفرعية لخلق الفردية الصفحات ؟ الآن أنت ملعون.بالتأكيد, يمكنك العودة ربط نمط الديكور, ولكن لماذا تذهب من خلال كل هذا العمل عند هذه المشكلة يمكن تجنبها عن طريق عدم غبي فئة التصميم في المقام الأول ؟

ثالثا ، هو فكرة مرددا HTML في المقام الأول.أنا بخير مع صدى كلمة أو اثنين هنا علامة أو ثلاثة هناك.ولكن HTML كبيرة قطع, انها مجرد حماقة.تمتلك الحشمة الهروب إلى وضع الإخراج واستخدام HTML ليس أغلقت في سلسلة.ليس فقط هو أنه من الأسهل أن تحرير و قراءة, يمكنك فعلا العمل معها في WYSIWYG ينبغي أن كنت ترغب في ذلك.

الرابع, هذا سيء ، بشدة فواصل SRP.

الخامسة - هذا نوع من السخرية التصميم يؤدي إلى نوع من المشاكل أنت تحاول حل هنا.أنت فقط لا تريد أن تعرف أن الحل هو إزالة الصدى البيانات من المنشئ الخاص بك.هل هناك طريقة للتغلب على ذلك ؟ بالتأكيد.في الحقيقة هناك أكثر من واحد.لا أنصح أي واحد منهم ؟ لا ليس حقا.

وأخيرا دعونا نناقش رؤوس.ربما لم تعلم عنهم بعد.ربما لديك و لا يهمني.ولكن ماذا سيحدث عندما, 6 أشهر من الآن كنت تعمل على مشكلة كنت تعمل داخل أسلوب 10 مكالمات العميق في المكدس و كنت أدرك بسيط header() وظيفة سيتم حل المشكلة الخاصة بك.ربما تحتاج إلى ضبط cache-control أو تحتاج إلى تعيين يدويا رمز الاستجابة - أيا كان.ولكن تخمين ما لا تستطيع.لماذا ؟ لأن سخيفة منشئ مخرجات الى المتصفح ميلي ثانية واحدة بإنشائه.

لذا, باختصار: لا! إلا إذا الفعلية الخاصة بك, الهدف النهائي هو أن نرى بعض جدا على العمل اليدوي على اليومية WTF.

ماذا يمكن أن أقدم إلى جانب عتاب?ربما جزء من الاتجاه الجديد ؟ حسنا, التصحيح الناتج من الصعب بما فيه الكفاية في بناء الأنظمة, لذلك لا تبدأ بإطلاق النار على نفسك في القدم أن يفعل ذلك ضمنا.كل من إخراج النظام الخاص بك يجب أن يكون صراحة.إذا كنت تريد أن تجعل من "الصفحة" نوع من فئة لا بأس.فقط لا تفعل ذلك مثل أن.

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();

نصائح أخرى

هل يمكن أن تفعل كل الطباعة في المدمر.هناك كل المتغيرات.ومع ذلك (كما قلت أنت نفسك) أعتقد أن هذا هو حقا سيئة حقا الممارسة.أود أن أقترح استخدام نوع من عرض / ملفات القالب (أنت على أي حال لديك ما يكفي من الوقت :) ).

هل يمكن تمرير عنوان كحجة في البناء ؟

schnalle: هذه الممارسة السيئة.هذا هو الجنون.
the_noob: الجنون ...?
the_noob: (صيحات) هذا ...هو ...LITTLEFRAMEWORKIMBUILDING!
the_noob: (جزاء الفصل من رمز العرض أسفل البئر)

أنا حقا لا تحصل على ما كنت تريد أن تفعل, ولكن مجرد تمرير العنوان كمعلمة إلى منشئ ...

<?php

class Title {
    public function __construct($title) {

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

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

?>

إذا كنت تريد حقا الأشياء الخاصة بك لطباعة شيء, أود أن أقترح السحر __tostring (), لذلك يمكنك ببساطة echo وجوه الخاص بك.ولكن علامات html ...لا تزال غير مفيدة.

أتمنى لك التوفيق مع الإطار الخاص بك, ولكن إما أنك عبقري (لا يحتمل) أو رجل الوقوع في الأخطاء نفسها (تقريبا) كل مبتدئ هل (قبل MVC وصل).

تحرير: لا أستطيع مساعدتك.كنت تريد الانتاج المباشر عندما يتم إنشاء الكائن ، ولكن تحتاج إلى الحصول على البيانات في كائن قبل خلق.إذا كنت في محاولة الحل شيء قبيح في جعلها أكثر قبحا.انها فقط لا يعمل بهذه الطريقة!
أنت تحاول بناء جديد, أفضل نوع السيارة عن طريق ربط عجلات المعيشة حمار ، ثم يشكو لأنه بطريقة أو بأخرى لم تعمل كما هو متوقع (حمار على عجلات!wheooo!), والآن تسأل المجتمع كيفية إرفاق المصابيح الخلفية بطريقة تجعل الحمار/السيارة أسرع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top