روز برنامه‌نویس مبارک 🤩🎉 از هدایای روز برنامه‌نویس جا نمونی ⌛
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علی طباطبایی
جواب تمرین دریافت داینامیک پارامتر‌های درخواست
جامعه پی اچ پی ایجاد شده در ۰۲ بهمن ۱۴۰۰

در کلاس Request :

 public function __get($name)
    {
        return $this -> params()[$name] ?? "not found :(";
    }

در front controller :

use App\\Core\\Request;
$request = new Request();
echo $request->name;

403e-request.png

زمانی که در یک کلاس بخواهیم به مقدار یک پراپرتی غیر قابل دسترس، دست پیدا کنیم متد جادویی ()get__ صدا زده میشود. غیر قابل دسترس مانند زمانی که اصلا در کلاس تعریف نشده است یا سطح دسترسی آن private یا protected هست

سلام علی جان

این تعریف شما کاملا به سیاست‌ها و استراتژی پروژه برمیگرده به صورت کلی زمانی که ما از getter و یا setter استفاده میکنیم هدف بیاده سازی بحث کپسوله سازی هستش .

ولی در برخی موارد برای دریافت اطلاعاتی که به صورت POST|GETویا داده‌های جدول در پایگاه داده وجود داره برای سادگی فراخانی از getter استفاده میکنیم و برای تغییر در داده‌های ورودی از setter این ایده رو لاراول خیلی جامع پیاده سازی مرده و پینهاد میدم در خصوص اکسسور‌ها و میوتد‌ها در لاراول یک مطالعه انجام بدی

مثال زیر در خصوص پروژه شما گزنه مناسبی هستش :

class Request
{
  public array $params = array('getParamUserName' => 'Ali') ;
  public function getParams()
  { 
   return $this->params ;
  } 
  public function getParam($keyParam)
  { 
   return (isset($this->params[$keyParam]) ? $this->params[$keyParam] : null) ;
  }
  public function __get($param)
  {
  return $this->getParam($param) ;
  }
 }

در مثال بالا یک کلاس داریم که در یک پرارپتی مقداری که از طریق GET ارسال میشن رو دریافت میکنه

متود getParams یک ارایه به ما تحویل میده که تمام مقادیر وجود دارد و ما در قسمت مورد نظر باید اطلاعات رو با رویکرد آرایه‌ها باهاش کار کنیم .

متود getParam داخل پرارپری رو جستوجو میکنه و به ما در صورت وجود اون کلید به ما اطلاعات رو میده دقیت داشته باش که از این متود باید به این صورت استفاد ه کنیم :

$request = new Request ;
echo $request->getParam('getParamUserName') ;
//outPut => Ali

متود جادویی __get ایجا به صورت یک سرباز وظیفه داره همه چیرو گوش میده اگر متود یا پراپرتی صدا زده بشه که تو ساختار نباشه انجاس که متود جادویی فعال میشه و با توجه به وظیفه ای که بهش دادیم عمل میکنه و اطلاعات مورد نظر رو برای ما تامین میکنه .

$request = new Request ;
echo $request->getParamUserName;
//outPut => Ali

اینجا ما متودیا پرارپتی در کلاس نداریم که اسشم getParamUsserName باشه ولی با توجه به وظیفه ای که گرند متود جادویی __get گزاشتیم خودش این مقدار رو دریافت میدنه و بعد متود getParam رو صدا میزنه و مقدار getParamUserName رو بهش ارسال میکنه

این جوری بهش نگاه کن در پس زمینه این اتفاق می‌افته :

$request = new Request ;
echo $request->getParamUserName;
        -(1) $request->__get('getParamUserName');
        -(2) $request->getParam('getParamUserName') ;
        -(3) return $params['getParamUserName'] ;

در قسمت 1 متود جادویی __get مقدار رو دریافت میدنه و در قسمت 2 بنده این متود مقدار getParam رو اجرا میکنه و در نهایت خروجی مربوطه رو به شما نشون میده .



محمد نقلانی ۰۵ بهمن ۱۴۰۰، ۰۷:۴۰

سلام اقای نقلانی مرسی از توضیحات کاملتون من کد هایی که نوشته بودم رو طبق توضیحات شما به شکل زیر اصلاح کردم:

کد قدیمی :

class Request
{
   private $params;
  #---------------------------
   public function __construct()
      {
          $this -> params = $_REQUEST;
    }
  #---------------------------------
   public function params():array
      {
          return $this -> params;
      }
  #----------------------------------
    public function __get($name):mixed|string
    {
        return $this -> params()[$name] ?? "not found :(";
    }
}

کد جدید:

class Request
{
   private array $params;
  #---------------------------
   public function __construct()
      {
          $this -> params = $_REQUEST;
      }
  #---------------------------------
   public function getParams():array
      {
          return $this -> params;
      }
  #----------------------------------
  public function getParam(mixed $keyParam):mixed|null
      { 
          return isset($this->params[$keyParam]) ? $this->params[$keyParam] : null ;
      }
  #-----------------------------------
  public function __get($param)
      {
          return $this->getParam($param);
      }
  #------------------------------------
}
    

اگر درست فهمیده باشم توضیحات شما رو یعنی من نباید مستقیما تو متد جادویی get بیام اطلاعات یک پراپرتی پرایویت رو بگیرم باید یک getter جدا به عنوان واسطه تعریف کنم که اون بیاد اول برام چک کنه که آیا این مقدار به خصوصی که ست شده اصلا هست تو پارامتر‌ها یا نه اگر وجود داشت مقدارش رو بگیره و برگردونه.

علی طباطبایی ۰۵ بهمن ۱۴۰۰، ۰۸:۵۸

نه این الزام نیست که حتما این کار رو انجام بدید

ببیند این اعتقاد خودم هستش و یک اصل نیست ، ما در کلاس پراپرتی هایی داریم که خودمون تعریفش میکنیم مثل همین

private array $params ;

برای این معمولا و بهترین روش ایجاد متود هایی هستش که عمل دریافت و یا ست کردن رو انجام بده مثل موارد زیر

public function getparams(){}
public function setParams(){}

اینجا ما کلاس رو کپسوله سازی کردیم و به راحتی و از راه هایی که ما اکسسز دادیم عملیات دریافت و ست کردن انجام میشه .


حالا میخوایم مقادیر رو از داخل پراپرتی خصوصی params دریافتش کنیم که به صورت یک اراییه انجمنی یا اسوسیتیو هستن برای دسترسی سریع وراحت و اینکه شما دیگه اینجا پراپرتی تعرف نمیکنید خود $_REQUEST داره اون رو پر میکنه و برای هر درخواست این موارد فرق داره میای یک متود جادویی __get ایجاد می‌کنی و اسم کلید اون مقداری که در $_REQUEST وجود داره دو به صورت یک پراپرتی به شئ کلاس میدی (توجه داشته باش که در کلاس اصلا همچین پراپرتی وجود نداره و سیستم باید ارور بده درسته؟! )

ولی اروری دریافت نمیشه چون تو متود جادویی گت داری چک می‌کنی اگر وجود نداشت بجای ارور بگو وجود نداره والی اگر پیداش کردی نتیجه رو اعلام کن

بهترین پاسخ
محمد نقلانی ۰۵ بهمن ۱۴۰۰، ۰۹:۳۴