বেরির উত্তরের প্রসারকে প্রসারিত করার জন্য, সুরক্ষিতভাবে অ্যাক্সেসের স্তর নির্ধারণের ফলে __get এবং __set স্পষ্টভাবে ঘোষিত বৈশিষ্ট্য (যখন শ্রেণীর বাইরে প্রবেশ করা যায়, কমপক্ষে) এবং গতি যথেষ্ট ধীর হয়ে যায়, আমি অন্য প্রশ্নের একটি মন্তব্য উদ্ধৃত করব allows এই বিষয়ে এবং এটি যেভাবেই হোক ব্যবহার করার জন্য একটি কেস তৈরি করুন:
আমি সম্মত হই যে __get একটি কাস্টম গিফট ফাংশন (একই জিনিসগুলি করা) এর চেয়ে ধীর গতির, এটি __get () এর জন্য 0.0124455 সময় এবং এই 0.0024445 10000 লুপের পরে কাস্টম গেট () জন্য। - মেলসি 23 নভেম্বর '12 এ 22:32 সেরা অনুশীলন: পিএইচপি যাদু পদ্ধতি __ সেট এবং __get
মেলসির পরীক্ষাগুলি অনুসারে, যথেষ্ট ধীর প্রায় 5 গুণ ধীর er এটি অবশ্যই যথেষ্ট ধীর, তবে এটিও নোট করুন যে পরীক্ষাগুলি দেখায় যে আপনি এখনও 10 সেকেন্ডে এই পদ্ধতিতে কোনও সম্পত্তি অ্যাক্সেস করতে পারবেন, লুপ পুনরাবৃত্তির জন্য সময় গণনা করতে পারার জন্য প্রায় এক সেকেন্ডের প্রায় 1/100। এটি প্রকৃত গেট এবং সেট পদ্ধতির সংজ্ঞায়নের তুলনায় যথেষ্ট ধীর এবং এটি একটি সংক্ষিপ্ত বিবরণ, তবে জিনিসগুলির দুর্দান্ত পরিকল্পনায় এমনকি 5 গুণ ধীরে ধীরে ধীরে ধীরে কখনও ধীর হয় না।
অপারেশনটির কম্পিউটিং সময়টি এখনও তুচ্ছ এবং বাস্তব বিশ্বের অ্যাপ্লিকেশনগুলির 99% হিসাবে বিবেচনা করার মতো নয়। কেবলমাত্র যখন এটিকে এড়ানো উচিত তখনই আপনি যখন কোনও একক অনুরোধে 10,000 টিরও বেশি বার বৈশিষ্ট্যগুলি অ্যাক্সেস করতে যাচ্ছেন। উচ্চ ট্র্যাফিক সাইটগুলি তাদের অ্যাপ্লিকেশনগুলি চালিয়ে যেতে আরও কয়েকটি সার্ভার নিক্ষেপ করতে না পারলে সত্যিই কিছু ভুল করছে। উচ্চ ট্র্যাফিক সাইটের ফুটারে একটি একক লাইন পাঠ্য বিজ্ঞাপন যেখানে অ্যাক্সেস রেট একটি সমস্যা হয়ে দাঁড়ায় সম্ভবত সেই পাঠ্যের লাইনটি সহ 1000 সার্ভারের খামারের জন্য অর্থ প্রদান করতে পারে। শেষ ব্যবহারকারী কখনই পৃষ্ঠাটি লোড হতে এত বেশি সময় নিচ্ছে তা ভেবে তাদের আঙ্গুলগুলি কখনই ট্যাপ করবেন না কারণ আপনার অ্যাপ্লিকেশনটির সম্পত্তি অ্যাক্সেস এক সেকেন্ডের মিলিয়ন ভাগ সময় নেয়।
আমি বলছি। নেট মধ্যে একটি পটভূমি থেকে আসা বিকাশকারী হিসাবে এই কথা বলা, তবে গ্রাহকের কাছে অদৃশ্য প্রাপ্তি এবং সেট পদ্ধতিগুলি NET এর আবিষ্কার নয়। এগুলি কেবল এগুলি ছাড়া সম্পত্তি নয়, এবং এই যাদু পদ্ধতিগুলি তাদের বৈশিষ্ট্যগুলির বৈশিষ্ট্যগুলিকে একেবারেই "বৈশিষ্ট্য" বলার জন্য পিএইচপি এর বিকাশকারীদের সংরক্ষণের অনুগ্রহ। এছাড়াও, পিএইচপি-র জন্য ভিজ্যুয়াল স্টুডিও এক্সটেনশন সুরক্ষিত বৈশিষ্ট্যগুলির সাথে ইন্টেলিজেন্সকে সমর্থন করে, সেই কৌশলটি মাথায় রেখে think আমি এইভাবে ম্যাজিক __get এবং __set পদ্ধতিগুলি ব্যবহার করে পর্যাপ্ত বিকাশকারীদের সাথে ভাবতে পারি, পিএইচপি বিকাশকারীরা বিকাশকারী সম্প্রদায়কে পূরণ করতে মৃত্যুদন্ড কার্যকর করার সময়টি নির্ধারণ করতে পারে।
সম্পাদনা: তাত্ত্বিকভাবে, সুরক্ষিত বৈশিষ্ট্যগুলি মনে হয়েছিল এটি বেশিরভাগ পরিস্থিতিতে কাজ করবে। অনুশীলনে, দেখা যাচ্ছে যে ক্লাস সংজ্ঞা এবং বর্ধিত শ্রেণীর মধ্যে বৈশিষ্ট্য অ্যাক্সেস করার সময় আপনি আপনার জেটর এবং সেটটারগুলি ব্যবহার করতে চান এমন অনেক সময় রয়েছে। আরও ভাল সমাধান হ'ল অন্যান্য ক্লাস প্রসারিত করার জন্য একটি বেস ক্লাস এবং ইন্টারফেস, যাতে আপনি কেবল বেস ক্লাস থেকে কোড কয়েকটি লাইন প্রয়োগকারী শ্রেণিতে অনুলিপি করতে পারেন। আমি আমার প্রকল্পের বেস শ্রেণীর সাথে আরও কিছু করছি, সুতরাং এখনই সরবরাহ করার জন্য আমার কোনও ইন্টারফেস নেই, তবে এখানে অপ্রচলিত স্ট্রিপ ডাউন ক্লাস সংজ্ঞাটি রয়েছে যাদু সম্পত্তি পাওয়ার সাথে সাথে বৈশিষ্ট্যগুলি সরিয়ে এবং সরানোর জন্য প্রতিচ্ছবি ব্যবহার করে সেট করা হচ্ছে একটি সুরক্ষিত অ্যারে:
class Component {
protected $properties = array();
public function __get($name) {
$caller = array_shift(debug_backtrace());
$max_access = ReflectionProperty::IS_PUBLIC;
if (is_subclass_of($caller['class'], get_class($this)))
$max_access = ReflectionProperty::IS_PROTECTED;
if ($caller['class'] == get_class($this))
$max_access = ReflectionProperty::IS_PRIVATE;
if (!empty($this->properties[$name])
&& $this->properties[$name]->class == get_class()
&& $this->properties[$name]->access <= $max_access)
switch ($name) {
default:
return $this->properties[$name]->value;
}
}
public function __set($name, $value) {
$caller = array_shift(debug_backtrace());
$max_access = ReflectionProperty::IS_PUBLIC;
if (is_subclass_of($caller['class'], get_class($this)))
$max_access = ReflectionProperty::IS_PROTECTED;
if ($caller['class'] == get_class($this))
$max_access = ReflectionProperty::IS_PRIVATE;
if (!empty($this->properties[$name])
&& $this->properties[$name]->class == get_class()
&& $this->properties[$name]->access <= $max_access)
switch ($name) {
default:
$this->properties[$name]->value = $value;
}
}
function __construct() {
$reflected_class = new ReflectionClass($this);
$properties = array();
foreach ($reflected_class->getProperties() as $property) {
if ($property->isStatic()) { continue; }
$properties[$property->name] = (object)array(
'name' => $property->name, 'value' => $property->value
, 'access' => $property->getModifier(), 'class' => get_class($this));
unset($this->{$property->name}); }
$this->properties = $properties;
}
}
কোডটিতে কোনও বাগ থাকলে আমার ক্ষমা চাই।