سؤال

أنا أستخدم فئة Magic Getter/Setter لمتغيرات الجلسة الخاصة بي ، لكنني لا أرى أي فرق بين المستقلين العاديين والغالين.

الرمز:

class session
{
    public function __set($name, $value)
    {
        $_SESSION[$name] = $value;
    }

    public function __unset($name)
    {
        unset($_SESSION[$name]);
    }

    public function __get($name)
    {
        if(isset($_SESSION[$name]))
        {
            return $_SESSION[$name];
        }
    }
}

الآن أول شيء لاحظته هو أنه يجب علي الاتصال $session->_unset('var_name') لإزالة المتغير ، لا شيء "سحري" حول ذلك.

ثانياً عندما أحاول الاستخدام $session->some_var هذا لا يعمل. لا يمكنني سوى الحصول على متغير الجلسة باستخدام $_SESSION['some_var'].

لقد نظرت إلى دليل PHP لكن الوظائف تبدو كما هي لي.

هل أفعل شيئًا خاطئًا ، أم أنه ليس هناك أي شيء سحر حول هذه الوظائف.

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

المحلول

العدد الأول ، عندما تتصل

unset($session->var_name);

يجب أن يكون هو نفسه الاتصال

$session->_unset('var_name');

فيما يتعلق بعدم القدرة على استخدام __get () ؛ ما الذي لا يعمل؟ ماذا يتم تعيين المتغير وما هي التحذيرات. تأكد من أنك قد حددت error_reporting() إلى e_all.

قد يكون من الجيد أيضًا التحقق الذي اتصلت به session_start

نصائح أخرى

اعتقدت أن getters و petters كانوا للمتغيرات داخل الفصل؟

class SomeClass {
    private $someProperty;

    function __get($name) {
        if($name == 'someProperty') return $this->someProperty;
    }

    function __set($name, $value) {
        if($name == 'someProperty') $this->someProperty = $value;

    }
}


$someClass = new SomeClass();
$someClass->someProperty = 'value';
echo $someClass->someProperty;

?

class session { /* ...as posted in the question ... */ }

session_start();
$s = new session;
$s->foo = 123;
$s->bar = 456;
print_r($_SESSION);

unset($s->bar);
print_r($_SESSION);

مطبوعات

Array
(
    [foo] => 123
    [bar] => 456
)
Array
(
    [foo] => 123
)

حسنًا ، ربما ليس "سحريًا". ولكن يعمل على النحو المقصود.
إذا لم يكن هذا ما تريده ، فيرجى توضيح ...

هذا هو فهمي حتى الآن عن وظيفة السحر

يرجى تصحيح لي إذا كنت مخطئا...

جلسة $ هي صفيف وليس كائنًا لذلك يمكنك الوصول إليهم باستخدام حقل جلسة $ ["الحقل"] وليس جلسة $->

تتيح لك الوظيفة السحرية استخدام اسم الوظيفة __fnname قبل أي وظيفة مثل

fnnamenewfield (قيمة $) ؛

لذلك ، سيتم فصله إلى نيوفيلد كمفتاح وسيتم إرساله إلى __fnname وسيتم إجراء Oprations على هذا

على سبيل المثال: سيتم إرسال setNewId (قيمة $) إلى __set () مع المفتاح = new_id والمعلمات ...

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