اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

وعليكم السلام، 

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

تخيل السيناريو التالي: 

  • يوجد لدينا صنف User و Profile بحيث يمتلك الأول خاصية profile، في حين يمتلك الثاني خاصية باسم name
    class User {
        public $profile = null;
        
        public function __construct($profile = null){
            if(!is_null($profile)){
                 $this->profile = $profile;
            }
        }
    }
    
    class Profile {
        public $name = null;
        public function __construct($name){
            $this->name = $name;
        }
    }

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

  • في السابق وبدون المعامل الفارغ، كنا نقوم بالمقاربة التالية لاستخراج الخاصية name من خلال user:

    $profile = new Profile('ahmed');
    $user = new User($profile);
    $name = null; // تصريح قيمة افتراضية لمتغير باسم name
    
    if ($user !== null && $user->profile !== null && $user->profile->name !== null) {
        $name = $user->profile->name; // تخزين الاسم في متغير
    }
    
    echo $name; // إما قيمة الاسم إذا كان موجودًا أو null إذا لم يكن موجودًا.

     

  • أما الآن فسيكفينا كتابة السياق التالي:

    $name = $user?->profile?->name;
    echo $name;

     

بدون المعامل الفارغ سوف تحتاج القيام بالكثير من التحققات، لأنك لو حاولت قراءة name مباشرة من خلال:

$name = $user->profile->name;

سوف يظهر لك خطأ على نحو:

Warning: Attempt to read property "name" on null in /home/user/scripts/code.php on line 23
  • 0
نشر

بداية من الإصدار PHP 8.0 ، تم إضافة المعامل الفارغ الآمن Null Safe Operator لتسهيل التعامل مع القيم الفارغة (null) دون حدوث أخطاء.

المعامل الفارغ الآمن `?->` يستخدم للوصول إلى خاصية أو طريقة من خلال سلسلة من الكائنات، وإذا كان أي من الكائنات في السلسلة هو قيمة فارغة (null)، فإن المعامل الفارغ الآمن يعود بقيمة فارغة أيضًا بدلاً من حدوث خطأ.

لنفترض أن لدينا الكود التالي كمثال:

// تعريف الكائنات
class User {
    public function getName() {
        return "John Doe";
    }
}

class Address {
    public function getCity() {
        return "New York";
    }
}

// إنشاء كائنات
$user = new User();
$address = new Address();

إذا أردنا الحصول على اسم المستخدم ومدينته، ولكن قد يكون أحد الكائنات غير موجود (قيمة null)، فيمكننا استخدام المعامل الفارغ الآمن كما يلي:

// الحصول على اسم المستخدم
$name = $user?->getName(); // "John Doe"

// الحصول على مدينة العنوان
$city = $address?->getCity(); // "New York"

// الحصول على اسم المدينة إذا كانت متاحة أو قيمة فارغة إذا كانت المدينة غير متاحة
$cityName = $address?->getCity()?->getName(); // null

في المثال الأول، يتم الوصول إلى طريقة `getName()` من خلال الكائن `$user`، ونحصل على قيمة الاسم بشكل صحيح. في المثال الثاني، يتم الوصول إلى طريقة `getCity()` من خلال الكائن `$address`، ونحصل على قيمة المدينة بشكل صحيح.

في المثال الثالث، نقوم بالوصول إلى طريقة `getCity()` من خلال الكائن `$address`، ومن ثم نحاول الوصول إلى طريقة `getName()` من خلال القيمة المُعادة من `getCity()`، ولكنها تعود بقيمة فارغة (null)، لذلك يتم إرجاع قيمة فارغة (null) للمتغير `$cityName`.

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

  • 0
نشر

إذا كنت قد استخدمت معامل الدمج الفارغ (null coalescing operator) في الماضي، فربما لاحظت أيضًا عيوبه: لا يعمل الدمج الفارغ في استدعاءات التوابع. بدلاً من ذلك، تحتاج إلى اختبارات تحقق وسيطة، أو تعتمد على المعامل optional المتاح في بعض الأطر:

$startDate = $subscription->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

يوفر المعامل (null safe) وظائف مشابهة للمعامل (null coalescing)، ولكنه يدعم أيضًا استدعاءات التوابع. بدلاً من كتابة هذا:

<?php

$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();

    if ($address !== null) {
      $country = $address->country;
    }
  }
}

الإصدار الثامن من PHP يسمح لك بكتابة:

$country = $session?->user?->getAddress()?->country;

فهو يتحقق إن كان أي من الكائنات في السلسلة قيمته null فإنه يُعيد null دون حدوث خطأ، أما إن كان هناك كائن فإنه يستدعي الخاصية أو التابع. 

يُمكن إستخدامه في العديد من الحالات التي تتطلب التحقق و عبارات if كثيرة و الحالات التي نكون فيها نجهل القيمة المعادة من الكائن أو التابع إن كانت null أم قيمة حقيقية.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...