web-dev-qa-db-fra.com

Puis-je / comment faire appel à une fonction protégée en dehors d'une classe dans PHP

J'ai une fonction protégée définie dans une certaine classe. Je veux pouvoir appeler cette fonction protégée en dehors de la classe dans une autre fonction. Est-ce possible et si oui, comment puis-je y arriver?

class cExample{

   protected function funExample(){
   //functional code goes here

   return $someVar
   }//end of function

}//end of class


function outsideFunction(){

//Calls funExample();

}
14
Terry Hoverter

C'est le point de OOP - encapsulation:

privé

Only can be used inside the class. Not inherited by child classes.

protégé

Only can be used inside the class and child classes. Inherited by child classes.

Public

Can be used anywhere. Inherited by child classes.

Si vous souhaitez toujours déclencher cette fonction à l'extérieur, vous pouvez déclarer une méthode publique qui déclenche votre méthode protégée:

protected function b(){

}

public function a(){
  $this->b() ;
  //etc
}
13
vikingmaster

Techniquement, il est possible d'invoquer des méthodes privées et protégées à l'aide de l'API de réflexion. Cependant, 99% du temps le faire est une très mauvaise idée. Si vous pouvez modifier la classe, la solution correcte est probablement de simplement effectuer la méthode publique. Après tout, si vous avez besoin d'y accéder à l'extérieur de la classe, cela défait le point de marquer son protégé.

Voici un exemple de réflexion rapide, au cas où il s'agit d'une des nombreuses situations où il est vraiment nécessaire:

<?php
class foo { 
    protected function bar($param){
        echo $param;
    }
}

$r = new ReflectionMethod('foo', 'bar');
$r->setAccessible(true);
$r->invoke(new foo(), "Hello World");
40
Peter Geer

Vous pouvez remplacer cette classe avec un autre où vous faites ce public.

class cExample2 extends cExample {
  public function funExample(){
    return parent::funExample()
  }
}

(Notez que cela ne fonctionnera pas avec les membres privés)

Mais l'idée de membres privés et protégés est de ne pas être appelé de l'extérieur.

3
Voitcus

Si vous souhaitez partager le code entre vos classes, vous pouvez utiliser des traits, mais cela dépend de la manière dont vous souhaitez utiliser votre fonction/méthode.

De toute façon

trait cTrait{
   public function myFunction() {
      $this->funExample();
   }
}

class cExample{
   use cTrait;

   protected function funExample() {
   //functional code goes here

   return $someVar
   }//end of function

}//end of class

$object = new cExample();
$object->myFunction();

Cela fonctionnera, mais gardez à l'esprit que vous ne savez pas ce que votre classe est faite de cette façon. Si vous changez le trait, toutes vos classes qui l'utilisent seront également modifiées. C'est également une bonne pratique pour écrire une interface pour chaque trait que vous utilisez.

2
mhlavac

ici, je peux vous donner un exemple comme ci-dessous

<?php
    class dog {
        public $Name;
        private function getName() {
            return $this->Name;
        }
    }

    class poodle extends dog {
        public function bark() {
            print "'Woof', says " . $this->getName();
        }
    }

    $poppy = new poodle;
    $poppy->Name = "Poppy";
    $poppy->bark();
?>

ou une autre façon d'utiliser avec le dernier PHP

IN PHP Vous pouvez le faire en utilisant des réflexions. Pour appeler des méthodes protégées ou privées, utilisez la méthode SETACSECESSIBLE () http://php.net/reflectionMethod.setapessable (Juste réglez-le à vrai)

1
liyakat

Si vous savez ce que vous faites, vous pouvez utiliser une classe anonyme (PHP 7+)

class Bar {
    protected baz() {
        return 'Baz!';
    }
}

$foo = new class extends Bar {
    public baz() {
        parent::baz();
    }
}

$foo->baz(); // "Baz!"

https://www.php.net/manual/fr/language.oop5.Anonymous.php

0
Lucas Bustamante