الفرق بين المستقلين العاديين والسحريين
-
24-09-2019 - |
سؤال
أنا أستخدم فئة 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 والمعلمات ...