ฉันสงสัยว่าทำไมมันเป็นไปไม่ได้ที่จะสร้างปลั๊กอินสำหรับ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>
และเขียนใหม่_getClassMethods
ด้วยการ\ReflectionMethod::IS_PUBLIC
เปลี่ยนเป็น\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED
ภายในของวิธีการ
แต่ฉันสงสัยว่าทำไมมันเป็นไปไม่ได้ที่จะสกัดกั้นวิธีการป้องกันในคำนิยามวิธีการเดิม? มันมีผลกระทบสำคัญกับประสิทธิภาพหรือมีเหตุผลอื่น ๆ เช่นการอนุญาตให้โมดูลของบุคคลที่สามสร้างตรรกะของวีโอไอพีด้วยเช่นกัน "ยุ่ง"?