كيف يمكنني استخدام PHP's __Get () و __Set () لحقول محددة في صفي؟

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

سؤال

لقد قرأت جيدة PHP المواصفات على التحميل الزائد, ويبدو أن معظم الأمثلة تهدف إلى السماح ببساطة بتحديد حقول مخصصة (مماثلة ل Stdclass).

ولكن ماذا عن الحقول الخاصة المحددة في صفي؟ كيف يتم استرجاع / تعيين هذه؟ يمكنني القيام بتبديل القيم الممكنة والعمل على قيم معينة:

class A
{
    private $name;
    private $age;

    public function __get( $var )
    {
        switch ( $var )
        {
            case 'name':
                return $this->name;
                break;
            case 'age':
                return $this->age+10; // just to do something different ;)
                break;
            default:
                break;
        }
    }
}

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

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

المحلول

هذا من شأنه أن يجعلها عامة بشكل فعال، وعادة ما تكسبك هذا لك ببساطة استخدام الخصائص العامة (لكنك تدفع عقوبة الأداء ويجب أن تكتب المزيد من التعليمات البرمجية، والخلل المخاطرة).

استخدم ذلك فقط إذا كان لديك رمز موجود يستخدم الممتلكات العامة وأنت بحاجة فجأة إلى Getter / Setter لذلك (مثل مثالك مع age).

إذا كنت بحاجة إلى تنفيذ بعض التعليمات البرمجية عند قراءة / مكتوبة (على سبيل المثال، اجعلها تجلب للقراءة فقط أو أحضرها على المكشوف من قاعدة البيانات)، ثم يجب عليك استخدام Getters / Setters العادي (getAge()/setAge()).

نصائح أخرى

أنا جعل استخدام واسع النطاق __get() و __set() ولدي خصائص بلدي المعلنة public. وبعد أردت أفضل ما في العالمين، لذلك يمكن IDDE سرد الخصائص العامة بالنسبة لي عندما أكتب اسم مثيل الفصل. كيف أحصل على طرق Interceptor PHP للعمل، على الرغم من أن الخصائص عامة ومرئية خارج الفصل؟

إلغاء تحديد () الخصائص أريد __get() و __set() لاستخدامها في الفصل __construct().

معرفة هذه الطريقة استغرق زوجين أمسيات الإحباط :-)

لا أرى الكثير من الناس الذين يستخدمونها، ولكن هنا ما أعتقد.

لاسترداد المتغيرات الخاصة، ربما ترغب في إعطاء قائمة بالمتغيرات المحددة التي يمكن الوصول إليها من قبل الخارج. ثم، تحقق لمعرفة ما إذا كان المتغير المطلوب في مجموعة هذه الصفيف. إذا كان الأمر كذلك، فاسمح له بتغيير / حصلت. إذا لم يكن كذلك، إما خطأ أو إرجاع NULL.

بصراحة، فإن التطبيقات لهذا هي حقا حالة على حدة. إذا كان لديك فئة مستخدم قمت بتخزين جميع المعلومات في صفيف واحد، فيمكن أن تتم سحابة اسم مستخدم $ من $ من $ user-> حساب ['الاسم'] أو شيء من هذا القبيل.

أيضا، في حالة أخرى، يمكنك القيام ببعض التعديل قبل إعطائها القيم، مثل التجزئة كلمة المرور.

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