سؤال

أود أن أكون قادرًا على كتابة فئة PHP تتصرف مثل المصفوفة وتستخدم بناء جملة المصفوفة العادية للحصول على الإعداد والإعداد.

على سبيل المثال (حيث Foo عبارة عن فئة PHP من صنعي):

$foo = new Foo();

$foo['fooKey'] = 'foo value';

echo $foo['fooKey'];

أعلم أن PHP لديه الأساليب السحرية _get و _set ولكن تلك لا تسمح لك باستخدام تدوين المصفوفة للوصول إلى العناصر.تتعامل بايثون مع هذا الأمر عن طريق التحميل الزائد على __getitem__ و__setitem__.

هل هناك طريقة للقيام بذلك في PHP؟إذا أحدث ذلك فرقًا، فأنا أقوم بتشغيل PHP 5.2.

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

المحلول

إذا قمت بتمديد ArrayObject أو تنفيذ ArrayAccess ثم يمكنك أن تفعل ما تريد.

نصائح أخرى

كلا، يؤدي الإرسال فقط إلى مصفوفة PHP عادية - مما يؤدي إلى فقدان أي وظيفة تمتلكها فئة ArrayObject المشتقة.تحقق من هذا:

class CaseInsensitiveArray extends ArrayObject {
    public function __construct($input = array(), $flags = 0, $iterator_class =     'ArrayIterator') {
        if (isset($input) && is_array($input)) {
            $tmpargs = func_get_args();
            $tmpargs[0] = array_change_key_case($tmpargs[0], CASE_LOWER);
            return call_user_func_array(array('parent', __FUNCTION__), $tmp    args);
        }
        return call_user_func_array(array('parent', __FUNCTION__), func_get_args());
    }

    public function offsetExists($index) {
        if (is_string($index)) return parent::offsetExists(strtolower($index));
        return parent::offsetExists($index);
    }

    public function offsetGet($index) {
        if (is_string($index)) return parent::offsetGet(strtolower($index));
        return parent::offsetGet($index);
    }

    public function offsetSet($index, $value) {
        if (is_string($index)) return parent::offsetSet(strtolower($index, $value));
        return parent::offsetSet($index, $value);
    }

    public function offsetUnset($index) {
        if (is_string($index)) return parent::offsetUnset(strtolower($index));
        return parent::offsetUnset($index);
    }
}

$blah = new CaseInsensitiveArray(array(
    'A'=>'hello',
    'bcD'=>'goodbye',
    'efg'=>'Aloha',
));

echo "is array: ".is_array($blah)."\n";

print_r($blah);
print_r(array_keys($blah));

echo $blah['a']."\n";
echo $blah['BCD']."\n";
echo $blah['eFg']."\n";
echo $blah['A']."\n";

كما هو متوقع، يفشل استدعاء array_keys().بالإضافة إلى ذلك، فإن is_array($blah) يُرجع خطأ.ولكن إذا قمت بتغيير خط المنشئ إلى:

$blah = (array)new CaseInsensitiveArray(array(

ثم تحصل فقط على مصفوفة PHP عادية (is_array($blah) تُرجع صحيحًا، وتعمل array_keys($blah))، ولكن يتم فقدان جميع وظائف الفئة الفرعية المشتقة من ArrayObject (في هذه الحالة، لم تعد المفاتيح غير الحساسة لحالة الأحرف عمل).حاول تشغيل الكود أعلاه في كلا الاتجاهين، وستفهم ما أعنيه.

يجب أن توفر PHP إما مصفوفة أصلية تكون فيها المفاتيح غير حساسة لحالة الأحرف، أو تجعل ArrayObject قابلة للتحويل إلى مصفوفة دون فقدان أي وظيفة تنفذها الفئة الفرعية، أو تجعل جميع وظائف المصفوفة تقبل مثيلات ArrayObject.

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