سؤال

ولدي فئة مع بعض الطرق التي تعتمد من قبل معلمة واحدة. ما هي أفضل طريقة لكتابة هذه الطريقة؟

مثال:

الطريقة الأولى

class Test{

    var $code;

    function Test($type){
        if($type=="A"){
            $this->code=create_function(/*some args and some code*/);
        }
        else if($type=="B"){
            $this->code=create_function(/*some args and some code*/);
        }
    }

    function use(/*some args*/){
        return call_user_func($this->code,/*some args*/);
    }
}

الطريقة الثانية

class Test{

    var $type;

    function Test($type){
        $this->type=$type;
    }

    function use(/*some args*/){
        if($this->type=="A"){
            //some code
        }
        else if($this->type=="B"){
            //some code
        }
    }
}

$test=new Test("A");
$test->use();

والطريقة التي سوف تختار؟

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

المحلول

لا (إلا إذا كنت شرح أكثر وضوحا ما كنت بعد). عموما، تعتبر الأجسام المتخصصة أفضل من المتفرعة القائم على الملكية.

class Test {
    abstract function useIt();
}

class TestA extends Test {
    function useIt() { code for A }
}

class TestB extends Test {
    function useIt() { code for B }
}

نصائح أخرى

وأود أن اختيار الطريقة الثانية، بالنسبة للمبتدئين: call_user_func هي وظيفة الثقيلة (والأفضل استخدامه بطرق أخرى)، والتي من شأنها أن تكون متاحة ليس بدقة وبطريقة الشيئية، في حين أن الطريقة الثانية هو عليه.

وشكرا للحصول على إجابات.

ولدي التفكير في هذا لأني ايم بناء طبقة للتفاعل قاعدة البيانات. لذلك سيكون من الرائع أن نفعل هذا:

$db=new DB(/* host, user etc*/, "mysql");
or
$db=new DB(/* host, user etc*/, "mysqli");

ولكن نعم، فإن أفضل طريقة هي الميراث وOO، يمكنني أن أفعل بعض من هذا القبيل:

$db=new MysqlDB(/* host, user etc*/);
or
$db=new MysqliDB(/* host, user etc*/);

وشكرا مرة أخرى.

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