روز برنامه‌نویس مبارک 🤩🎉 از هدایای روز برنامه‌نویس جا نمونی ⌛
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ سام انوشه
آیا در ارث بری، Private فقط بر روی متود‌ها اعمال میشود؟
امیر صالحی حل شده توسط امیر صالحی

سلام

ببخشید من یک سوال برایم پیش آمد اینکه مثلا ما در کلاس Programmer از کلاس Person ارث بری کردیم، استاد گفتند فقط Method‌ها و Property هایی که public هستند ارث برده میشوند و در کلاس Programmer قابل استفاده هستند ولی وقتی من از متود‌های public مثل setAge و یا printAge در کلاس Programmer استفاده کردم مقدار سن را به من داد و یا میتوانستم سن را تغییر دهم.

خب در اینجا مگر سن Private نبود، پس چطور در کلاس Programmer قابل استفاده بود و میتوانستیم آن را مقدار دهی کنیم؟ (و هیچ اروری نمیداد در صورتی که وقتی از یک متود Private استفاده میکردم ارور میداد)

ممنون میشم پاسخ دهید.

سلام و احترام

متدها و پراپرتی‌های private داخل خود کلاس در دسترس هستند اما اگه برای اون‌ها ما setter و getter قرار بدیم میتونیم مقادیرشون رو دریافت و یا ست کنیم برای مثال 

  class Person{
      private $name;
   }
   $person = new Person();
   echo $person->name;

اگه ما بخواهیم به این پراپرتی name که private هست دسترسی داشته باشیم قطعا به خطا میده

PHP Error Cannot access private property Person::$name

اما برای اینکه بتونیم مقدارشو دریافت کنیم میتونیم براش یک getter که public هست تعریف کنیم

  class Person{
      private $name;
      public function getName(){
         return $this->name;
      }
   }
   $person = new Person();
   $name = $person->getName();
   echo $name;

ما چون getterمون داخل کلاس Person هستش پس به پراپتری‌ها و متدهای اون کلاس دسترسی داریم و میتونیم به این شکل ازشون استفاده کنیم

 

بهترین پاسخ
امیر صالحی ۱۷ مهر ۱۴۰۰، ۱۶:۰۷

سلام.

این نکته رو هم من اضافه کنم:

از طریق Reflection Api میتونید به پراپرتی private دسترسی داشته باشید.

این مثالو ببینید:

<?php
class Test {
    private $name;
    function __construct() {
        $this->name = 'Mohsen';
    }
}
$obj = new Test;
$reflector = new ReflectionClass($obj);
$name = $reflector->getProperty('name');
$name->setAccessible(true);
var_dump($name->getValue($obj));

 

محسن موحد ۲۰ مهر ۱۴۰۰، ۰۹:۰۰