كيف يمكنني استخدام "Dependency Injection" في وظائف php بسيطة ، وهل يجب عليّ أن أزعج نفسك؟



Answers

المثال الأول الخاص بك هو حقن الاعتماد ، فأنت تقوم بحقن التبعية على كائن قاعدة البيانات في الوظيفة.

قالت سارة هذا ليس ، لكن إيمو هو ، أعتقد أنها تفكر في حاويات حقن التبعية التي هي المستوى الأعلى:

http://components.symfony-project.org/dependency-injection/trunk/book/02-Dependency-Injection-Containers

Question

أسمع الناس يتحدثون عن حقن التبعية والاستفادة منها طوال الوقت ، لكنني لا أفهم ذلك حقاً.

أنا أتساءل عما إذا كان الحل لمشكلة "أنا اجتياز اتصالات قاعدة البيانات كوسيطة طوال الوقت".

حاولت قراءة مدخل ويكيبيديا عليه ، لكن المثال مكتوب بلغة جافا حتى لا أفهم بقوة الفرق الذي يحاول توضيحه. ( http://en.wikipedia.org/wiki/Dependency_injection ).

قرأت مقالة التبعية والحقن في php ( http://www.potstuck.com/2009/01/08/php-dependency-injection/ ) ، ويبدو أن الهدف هو عدم تمرير التبعيات إلى كائن مباشرة ، ولكن لتطويق إنشاء كائن إلى جانب إنشاء تبعياتها. لست متأكدًا من كيفية تطبيق ذلك في سياق استخدام php functions ، رغم ذلك.

بالإضافة إلى ذلك ، هو "Dependency Injection" التالي ، وينبغي أن أكون عناء محاولة القيام بالحقن التبعية في سياق وظيفي؟

الإصدار 1: (نوع الكود الذي أقوم بإنشائه ، ولكن لا يعجبني ، كل يوم)

function get_data_from_database($database_connection){
    $data = $database_connection->query('blah');
    return $data;
}

الإصدار 2: (ليس لديك لتمرير اتصال قاعدة البيانات ، ولكن ربما لا حقن التبعية؟)

function get_database_connection(){
    static $db_connection;
    if($db_connection){
        return $db_connection;
    } else {
        // create db_connection
      ...
    }
}

function get_data_from_database(){
   $conn = get_database_connection();
   $data = $conn->query('blah');
   return $data;
}

$data = get_data_from_database();

الإصدار 3: (إنشاء "البيانات" / البيانات منفصل ، ولا يزال رمز قاعدة البيانات ، لذلك ربما يعتبر هذا بمثابة حقن التبعية؟)

function factory_of_data_set(){
    static $db_connection;
    $data_set = null;
    $db_connection = get_database_connection();
    $data_set = $db_connection->query('blah');
    return $data_set;
}

$data = factory_of_data_set();

أي شخص لديه مورد جيد أو مجرد البصيرة التي تجعل من طريقة ومزايا كريستال واضحة؟




لقد فعلت الكثير من البحث في هذا الموضوع بنفسي (PHP Dependency Injection) ولم أجد الكثير مما يعجبني. تمت كتابة الكثير حول هذا الموضوع للغات الأخرى (Google Guice - http://code.google.com/p/google-guice/ ؛ Java Spring) ، ولكن لم أجد الكثير المتاح لـ PHP. بغض النظر عن اللغة ، فإن التحديات متشابهة.

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

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

دعوت نظام ديزل ولقد كنت سعيدا حقا به. لقد نشرت الكود على جيثب لأي شخص مهتم. يمكنك الحصول عليها من المدونة التي كتبت عنها حول الموضوع ، والتي تصف الاستخدام الأساسي بالإضافة إلى تفاصيل أكثر عن سؤالك. http://developers.blog.box.com/2012/02/15/introducting-diesel-php-dependency-injection/




Links