PHP-তে OOP-তে শুধুমাত্র পড়ার জন্য বৈশিষ্ট্য

আসুন একটি ক্লাস বিবেচনা করি যেখানে সমস্ত বৈশিষ্ট্য ব্যক্তিগত:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
  }
?>

এখন এটা করা যাক যাতে এই বৈশিষ্ট্যগুলি বাহ্যিক বিশ্বে শুধুমাত্র পড়ার জন্য উপলব্ধ হয়। আমরা আগে এটা করেছি, প্রতিটি বৈশিষ্ট্যের জন্য গেটার তৈরি করে এবং সেটার তৈরি না করে।

এখন এই কাজটি সমাধান করার জন্য আসুন জাদুকরী পদ্ধতি ব্যবহার করি __get। এতে অনুরোধ করা বৈশিষ্ট্যের মান ফেরত দেব। কিভাবে এটা করা যায়: অনুরোধ করা বৈশিষ্ট্যের নাম পদ্ধতির প্যারামিটারে পড়ে __get, আমাদের ক্ষেত্রে $property।

এর মানে হল যে আমরা বৈশিষ্ট্য পড়তে পারি, যার নাম ভেরিয়েবলে সংরক্ষিত আছে, এভাবে: $this->$property (বৈশিষ্ট্যের নাম হবে ভেরিয়েবল, অর্থাৎ শুরুতে ডলার সহ, আমরা এটা আগের পাঠগুলোতে শিখেছি)।

আসুন বর্ণিত পদ্ধতি __get তৈরি করি:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
    
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

এর বৈশিষ্ট্য পড়ার জন্য এটা ব্যবহার করা যাক:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // 1 দেখাবে
  echo $test->prop2; // 2 দেখাবে
?>

বৈশিষ্ট্যে কিছু লিখার চেষ্টা করলে ত্রুটি ঘটবে:

php<?php
  $test = new Test;
  $test->prop1 = 2; // একটি ত্রুটি দেবে
?>

এটা ঠিক আমাদের দরকার: বৈশিষ্ট্য পড়া যায় কিন্তু লেখা যায় না।

অস্তিত্বহীন বৈশিষ্ট্য পড়ার চেষ্টা করলে ত্রুটি দেবে:

php<?php
  $test = new Test;
  echo $test->prop3; // একটি ত্রুটি দেবে
?>

নিম্নলিখিত সূক্ষ্ম বিষয়টিতেও মনোযোগ দিন: যখন আমরা শুধুমাত্র পড়ার জন্য বৈশিষ্ট্য তৈরি করতাম পুরানো উপায়ে, তখন বৈশিষ্ট্য পড়ার জন্য আমরা একটি পদ্ধতি-গেটার ব্যবহার করতাম।

নতুন উপায়ে আমরা সরাসরি বৈশিষ্ট্যগুলিকেই ব্যবহার করব যেন সেগুলো সর্বজনীন। কিন্তু সেগুলোতে লিখতে পারব না, যেন সেগুলো ব্যক্তিগত।

Задание 1

ধরুন User নামে একটি ক্লাস দেওয়া আছে, যার বৈশিষ্ট্যগুলি শুধুমাত্র পড়ার জন্য উপলব্ধ গেটার ব্যবহার করে:

php<?php
  class User
  {
    private $name;
    private $age;
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getAge()
    {
      return $this->age;
    }
  }
?>

এই ক্লাসের কোডটি এমনভাবে পরিবর্তন করুন যাতে গেটারের পরিবর্তে জাদুকরী পদ্ধতি __get ব্যবহার করা হয়।