على الأقل قذرة وسيلة لفرض القيم المسموح بها أو نطاقات خصائص الطبقة

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

  •  02-10-2019
  •  | 
  •  

سؤال

نقول فرضا لدي الدرجة...

class Main {

    $prop1 = 2;
    $prop2 = 23;
    ...
    $prop42 = "what";

    function __construct($arg_array) {
        foreach ($arg_array as $key => $val) {
            $this->$key = $val;
            }
        }
    }

أقول إنشاء كائن...

$attributes = array("prop1"=>1, "prop2"=>35235, "prop3"=>"test");
$o = new Main($attributes);

توفر الخاصية الافتراضية القيم إذا لم توفيره من قبل المستخدم هو واضح.ولكن ماذا لو كنت ترغب في فرض حدود تعسفية على المستخدم الموردة قيم كائن خصائص ؟ ما إذا كنت ترغب في فرض $prop1 أن يكون من int, لا أقل من 1 ، و أن لا يكون أكبر من 5.، $prop42 أن تكون من نوع string, لا أقل من 'A', و لا أكبر من 'Z'?لهذا الغرض, ماذا سيكون أنظف طريقة حفظ البرنامج النصي قصيرة وحلوة ممكن ، وذلك باستخدام أي لغة ميزة أو خدعة ؟

أنا عالقة في __construct() التحقق الموردة القيم ضد القاعدة مجموعة بنيت مثل ذلك...

$allowable = array(
    "prop1" => array(
        'type' => 'int',
        'allowable_values' => array(
            'min' => 1,
            'max' => 5
            )
        ),
    "prop2" => array(
        'type' => 'int',
        'allowable_values' => array(
            1,
            235,
            37,
            392,
            13,
            409,
            3216
            )
        ),
    ...
    "prop42" => array(
        'type' => 'string',
        'allowable_values' => array(
            'min' => 'A',
            'max' => 'Z'
            )
        )
    );

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

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

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

المحلول

أنا واجهت مشكلة مشابهة في اليوم الآخر.وهنا ما أود أن تفعل:

   private $props;
   private $rules; 

   function __construct($params) {

      // or you can get the rules from another file, 
      // or a singleton as I suggested

      $this->rules = array (array('type' => 'range', 'min' => 10, 'max' => 20), 
        array('type' => 'in_set', 'allowed' => array(1,2,3)));

      for ($i=0; $i<count($params); $i++) {

         if ($this->check($params[$i], $this->rules($i))
            $this->props[$i] = $params[$i];
         else
            throw new Exception('Error adding prop ' . $i);
      }

   }


   function check($value, $rule) {
      switch($rule['type']) {
         case 'range':
            return ($rule['min'] <= $value && $value <= $rule['max']);  

         case 'in_set':
            return (in_array($value, $rule['allowed']));

         // and so on
      }
   }

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

تحرير:بالمناسبة, هناك حقا أي نقطة في اختبار من نوع في بي.بل هو على حد سواء ليست موثوقة جدا وغير ضرورية.

تحرير 2:بدلا من وجود متغير عمومي مع النظام ، يمكنك استخدام المفرد:

نصائح أخرى

حاصل على واضعي

class Main {
  private $prop1;
  private $prop2;
  private $prop3;

  public function __construct( $p1 , $p2 , $p3 )
  {
    $this->setProp1($p1);
    $this->setProp2($p2);
    $this->setProp3($p3);
  }

  public function setProp1($p1)
  {
    // conditional checking for prop1
    if(!$ok) throw new Exception('problem with prop1');
    $this->prop1 = $p1;
  }

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