সুরক্ষিত পদ্ধতিগুলি কেন বাধা দেওয়া যায় না?


14

আমি ভাবছিলাম যে কেন protectedপদ্ধতিগুলির জন্য প্লাগিন তৈরি করা সম্ভব নয় । কোডের এই টুকরোটিতে রয়েছে Magento\Framework\Interception\Code\Generator\Interceptor:

protected function _getClassMethods()
{
    $methods = [$this->_getDefaultConstructorDefinition()];

    $reflectionClass = new \ReflectionClass($this->getSourceClassName());
    $publicMethods = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC);
    foreach ($publicMethods as $method) {
        if ($this->isInterceptedMethod($method)) {
            $methods[] = $this->_getMethodInfo($method);
        }
    }
    return $methods;
}

এটি পরীক্ষা করে যে পদ্ধতিটি publicবাধা দেওয়ার অনুমতি দেওয়ার আগে রয়েছে কিনা । এটা সহজেই একটি তৈরি করে পরিবর্তন করা যাবে preferenceমধ্যে di.xmlঅবশ্যই, নিজের মডিউল, এই মত:

<?xml version="1.0"?>
<config>
    <preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>

এবং rewriting _getClassMethodsসঙ্গে \ReflectionMethod::IS_PUBLICপরিবর্তিত \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTEDপদ্ধতির ভিতরে।

তবে আমি ভাবছি কেন মূল পদ্ধতির সংজ্ঞায় সুরক্ষিত পদ্ধতিগুলিতে বাধা দেওয়া সম্ভব নয়? পারফরম্যান্সে এটির কি বড় প্রভাব রয়েছে, বা তৃতীয় পক্ষের মডিউলগুলিকে ম্যাগেন্টো যুক্তিটিকে খুব "অগোছালো" করার অনুমতি দেওয়ার মতো কোনও কারণ আছে?

উত্তর:


24

ম্যাজেন্টো ডক্স অনুসারে কোনও সুরক্ষিত পদ্ধতিতে প্লাগইন ব্যবহার করা "সম্ভব" নয়।

( http://devdocs.magento.com/guides/v2.0/existance-dev-guide/plugins.html )

আপনি এতে প্লাগিন প্রয়োগ করতে পারবেন না:

  • চূড়ান্ত পদ্ধতি
  • ফাইনাল ক্লাস
  • কমপক্ষে একটি চূড়ান্ত সর্বজনীন পদ্ধতি থাকা যে কোনও শ্রেণিতে
  • অ-পাবলিক পদ্ধতি
  • শ্রেণিবদ্ধ পদ্ধতি (যেমন স্থির পদ্ধতি)
  • __ ভার্চুয়াল প্রকারের কাঠামো করুন

তবে আপনার বক্তব্যটি সঠিক, এর ___callPluginsসংজ্ঞা অনুসারে Magento\Framework\Interception\Interceptor, সুরক্ষিত পদ্ধতিগুলি ব্যবহার করে আমি কোনও সমস্যা দেখছি না।

আমার প্রথম অনুমানটি হ'ল তারা এটিকে একটি উচ্চ কোড জটিলতা এড়ানোর জন্য সীমাবদ্ধ করেছিল যেহেতু ম্যাজেন্টোর কোনও সুরক্ষিত পদ্ধতি পুনর্লিখন করা উচিত এবং তাদের ___callPluginsপ্রত্যেকের জন্য কল করা উচিত ... এটি মারাত্মকভাবে ধীর গতিবেগ IMHO করবে।

তবে আমি মনে করি আসল কারণটি একটি লজিকাল ধারাবাহিকতার জন্য: প্লাগিনগুলি শ্রেণিক পদ্ধতিগুলির আউটপুট / ইনপুট পরিবর্তন করতে ব্যবহার করা উচিত , অভ্যন্তরীণ আচরণ পুনরায় লেখার জন্য নয়, তাই তাদের কেবল সর্বজনীন পদ্ধতিতে অ্যাক্সেস করা উচিত।

অভ্যন্তরীণ আচরণের পুনর্লিখনের জন্য আপনাকে একটি পছন্দ ব্যবহার করতে হবে। এটা বোঝা যায়।


1
ভাল উত্তর. আমি নিজেও এটি ভাবছিলাম কিন্তু একটি ওওপি / সলিউড দৃষ্টিকোণ থেকে এটি কেবল সর্বজনীন পদ্ধতিগুলিকে বাধা দেওয়ার অনুমতি দেওয়া বোধগম্য।
জিয়েল বার্কার্স

13

অ্যান্টন ক্রিলের উপস্থাপনা থেকে যদি আমি সঠিকভাবে মনে করি তবে তিনি বলেছিলেন যে প্রযুক্তিগতভাবে সুরক্ষিত পদ্ধতিগুলি বাধা দেওয়া যেতে পারে তবে এটি তাদের "সুরক্ষিত" করার উদ্দেশ্যকে পরাস্ত করে।
স্বয়ংক্রিয়ভাবে জড়িত ইন্টারসেপ্টর শ্রেণিটি মূল শ্রেণিকে প্রসারিত করে তাই এটি সুরক্ষিত পদ্ধতিতে অ্যাক্সেস পায়।
তবে ... সুরক্ষিত পদ্ধতিগুলি শ্রেণীর বাইরে পাওয়া উচিত নয়।
সুতরাং এটি সীমাবদ্ধতার চেয়ে সিদ্ধান্তের বেশি।


-4

এটি ওওপিএস সুরক্ষা বৈশিষ্ট্যটি ম্যাজেন্টো নির্দিষ্ট নয়।

সর্বজনীন দ্বারা লেবেলযুক্ত পাবলিক পদ্ধতিগুলি প্রতিটি শ্রেণীর জন্য উপলব্ধ। সুরক্ষিত দ্বারা লেবেলযুক্ত সুরক্ষিত পদ্ধতিগুলি সাবক্লাস এবং বন্ধুত্বপূর্ণ শ্রেণিতে উপলব্ধ, যা একই প্যাকেজের ক্লাস। বন্ধুত্বপূর্ণ পদ্ধতিগুলি, কিছুই দ্বারা লেবেলযুক্ত (যেমন ডিফল্ট) বন্ধুত্বপূর্ণ ক্লাসে উপলব্ধ। ব্যক্তিগত পদ্ধতিগুলি কেবলমাত্র ক্লাসে উপলব্ধ।

কারণ:

1) সুরক্ষিত পদ্ধতিগুলি উত্তরাধিকারের দ্বিতীয় স্তরে অ্যাক্সেস করতে পারে না।

উদাহরণ: একই প্যাকেজে ক্লাস এ এবং ক্লাস বি দুটি ক্লাসের উদাহরণ নেওয়া যাক।

ক্লাস বি কেবল উত্তরাধিকার সুরক্ষিত পাশাপাশি ক্লাস এ এর ​​পাবলিক পদ্ধতিগুলিও সংরক্ষণ করতে পারে Class


4
Protected methods... which are classes in the same package- এটা সত্য নয়। সুরক্ষিত পদ্ধতিগুলি কেবল উত্তরাধিকারের মাধ্যমে একই শ্রেণিবিন্যাসে উপলব্ধ ক্লাসগুলিতে উপলভ্য - সেগুলি একই প্যাকেজে থাকুক বা না পার্থক্য রাখুক। Protected Methods can't access in Inheritence second level.- আবারও সত্য নয় - সুরক্ষিত পদ্ধতিগুলি উত্তরাধিকারের কোনও স্তরে উপলব্ধ, কেবলমাত্র বস্তুর বাইরে নয়
রবি অ্যাভারিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.