Ich habe mich gefragt, warum es nicht möglich ist, Plugins für protected
Methoden zu erstellen . Es gibt diesen Code in 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;
}
Es wird geprüft, ob die Methode aktiviert ist, public
bevor das Abfangen zugelassen wird. Es kann leicht durch die Schaffung eines geändert werden preference
in der di.xml
von eigenen Modul, natürlich, wie folgt aus :
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
und das Umschreiben _getClassMethods
mit dem innerhalb der Methode \ReflectionMethod::IS_PUBLIC
geänderten \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED
.
Aber ich frage mich, warum es nicht möglich ist, geschützte Methoden in der ursprünglichen Methodendefinition abzufangen. Hat es einen großen Einfluss auf die Leistung oder gibt es einen anderen Grund dafür, zum Beispiel zuzulassen, dass Module von Drittanbietern die Magento-Logik zu "chaotisch" machen?
Wenn ich mich richtig an eine Präsentation von Anton Krill erinnere, sagte er, dass technisch geschützte Methoden abgefangen werden können, aber dies widerspricht dem Zweck, sie "geschützt" zu haben.
Die automatisch generierte Interceptor-Klasse erweitert die ursprüngliche Klasse, sodass sie Zugriff auf die geschützten Methoden hat.
Aber ... Geschützte Methoden sollten nicht außerhalb der Klasse verfügbar sein.
Es ist also eher eine Entscheidung als eine Einschränkung.
quelle
Es ist keine magento-spezifische OOPS-Sicherheitsfunktion.
Öffentliche Methoden, die mit public gekennzeichnet sind, stehen jeder Klasse zur Verfügung. Geschützte Methoden, die mit protected gekennzeichnet sind, stehen Unterklassen und Anzeigenklassen zur Verfügung, die Klassen im selben Paket sind. Friendly-Methoden, die mit nothing (dh default) gekennzeichnet sind, stehen Friendly-Klassen zur Verfügung. Private Methoden stehen nur der Klasse selbst zur Verfügung.
Gründe dafür:
1) Geschützte Methoden können nicht auf die zweite Ebene von Inheritence zugreifen.
Beispiel: Nehmen wir als Beispiel zwei Klassen der Klassen A und B in demselben Paket.
Klasse B kann nur vererbungsgeschützt sein sowie öffentliche Methoden der Klasse A.
quelle
Protected methods... which are classes in the same package
- das ist nicht wahr. Geschützte Methoden sind nur für Klassen verfügbar, die in derselben Hierarchie über eine Vererbung verfügbar sind - unabhängig davon, ob sie sich im selben Paket befinden oder nicht.Protected Methods can't access in Inheritence second level.
- Auch hier sind auf jeder Vererbungsebene nicht wahrheitsgeschützte Methoden verfügbar, nur nicht außerhalb des Objektbereichs