Saya bertanya-tanya mengapa tidak mungkin membuat plugin untuk protected
metode. Ada bagian kode ini di 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;
}
Ia memeriksa apakah metode public
sebelum memungkinkannya dicegat. Hal ini dapat dengan mudah diubah dengan menciptakan preference
dalam di.xml
modul sendiri, tentu saja, seperti ini:
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
dan menulis ulang _getClassMethods
dengan bagian dalam metode yang \ReflectionMethod::IS_PUBLIC
diubah \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED
.
Tapi saya bertanya-tanya mengapa tidak mungkin untuk mencegat metode yang dilindungi dalam definisi metode asli? Apakah itu berdampak besar pada kinerja, atau ada beberapa alasan lain untuk itu, seperti mengizinkan modul pihak ke-3 untuk membuat logika Magento terlalu "berantakan"?
Jika saya ingat dengan benar dari presentasi Anton Krill, dia mengatakan bahwa metode yang dilindungi secara teknis dapat dicegat, tetapi itu mengalahkan tujuan agar mereka "dilindungi".
Kelas interceptor yang di-autogenerasi memperluas kelas aslinya sehingga memiliki akses ke metode yang dilindungi.
Tapi ... Metode yang dilindungi tidak boleh tersedia di luar kelas.
Jadi itu lebih merupakan keputusan daripada batasan.
sumber
Ini adalah fitur keamanan OOPS tidak khusus magento.
Metode publik, diberi label oleh publik tersedia untuk setiap kelas. Metode yang dilindungi, diberi label oleh protected tersedia untuk subclass dan kelas ramah, yang merupakan kelas dalam paket yang sama. Metode ramah, dilabeli dengan tidak ada (yaitu default) tersedia untuk kelas ramah. Metode pribadi hanya tersedia untuk kelas itu sendiri.
Alasan:
1) Metode yang dilindungi tidak dapat mengakses di tingkat kedua Warisan.
contoh: Mari kita ambil contoh dua kelas Kelas A & Kelas B dalam paket yang sama.
Kelas B hanya dapat dilindungi warisan serta metode umum kelas A.
sumber
Protected methods... which are classes in the same package
- ini tidak benar. Metode yang dilindungi hanya tersedia untuk kelas-kelas yang tersedia dalam hierarki yang sama melalui warisan - apakah mereka ada dalam paket yang sama atau tidak ada bedanya.Protected Methods can't access in Inheritence second level.
- lagi, tidak benar - metode yang dilindungi tersedia di semua tingkat warisan, hanya saja tidak dari luar lingkup objek