سؤال

وأود أن تنجز شيئا من هذا القبيل: استدعاء الأسلوب، ويقول "تحويل"، ومن ثم يكون "تحويل" تطبق بشكل مختلف لأنواع مختلفة من البيانات، على سبيل المثال، داعيا "تحويل" مع "مفك" الاستخدامات الكائن / المعلمة و"turnScrewdriver" طريقة، داعيا "تحويل" مع "مقود" الكائن / المعلمة يستخدم أسلوب "turnSteeringWheel"، وما إلى ذلك - ". بدوره" يجري القيام به أشياء مختلفة، لكنها على حد سواء يسمى

وأود أن تنفيذ هذا بحيث رمز الدعوة لم داعي للقلق حول نوع (ق) المعنية. في هذا المثال، "تحويل" ينبغي أن يكون كافيا ل"تحويل" أ "مفك"، "مقود"، أو ما قد تحتاج إلى "تحول".

في C ++ كنت تفعل هذا مع الحمولة الزائدة - وC ++ سيكون ترتيب الأمور على أساس نوع البيانات / التوقيع - ولكن هذا لا يعمل في PHP

وأي اقتراحات إلى أين يجب أن نبدأ؟ وجاء في بيان التبديل هو واضح، ولكن أنا أفكر يجب أن يكون هناك (أكثر أناقة) حل OO. لا؟

وTIA

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

المحلول

وقرأت حل davethegr8 ولكن على ما يبدو يمكن للمرء أن تفعل الشيء نفسه مع كتابة أقوى:

<?php

interface Turnable
{
  public function turn();
}

class Screwdriver implements Turnable
{
  public function turn() {
    print "to turning sir!\n";
  }
}

class SteeringWheel implements Turnable
{
  public function turn() {
    print "to everything, turn, turn turn!\n";
  }
}

function turn(Turnable $object) {
  $object->turn();
}

$driver = new Screwdriver();
turn($driver);

$wheel = new SteeringWheel();
turn($wheel);

$obj = new Object(); // any object that does not implement Turnable
turn($object); // ERROR!

وPHP لا تسمح لك باستخدام نوع تلميح للمعلمة، ونوع تلميح يمكن أن يكون اسم واجهة بدلا من اسم الفئة. لذلك يمكنك أن تتأكد من أنه إذا كان $object تطبق الواجهة Turnable، ثم <م> يجب لديك طريقة turn(). كل فئة التي تطبق Turnable تستطيع أن تفعل ما يخصها لإنجاز تحول.

نصائح أخرى

وأعتقد أن هذا سوف يعمل ...

function turn($object) {
    if(method_exists($object, 'turn'.ucwords(get_class($object))) {
        $fname = 'turn'.ucwords(get_class($object));
        return $object->$fname();
    }

    return false;
}

وتحتاج إلى مراجعة دليل PHP للحصول على تعليمات هنا

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