friends - PHP equivalente de amigo o interno
friend modifier c++ (3)
Estoy bastante seguro de que lo que está buscando es "protegido" o "privado", según su caso de uso.
Si está definiendo una función en una clase y solo quiere que esté disponible para sí misma, la definirá de esta manera:
private function foo($arg1, $arg2) { /*function stuff goes here */ }
Si está definiendo una función en una clase que desea que esté disponible para las clases que heredan de esta clase, pero que no están disponibles públicamente, defínelo de esta manera:
protected function foo($arg1, $arg2)
Estoy bastante seguro de que por defecto en PHP5, las funciones son públicas, lo que significa que no tiene que usar la siguiente sintaxis, pero es opcional:
public function foo($arg1, $arg2) { /*function stuff goes here */ }
Aún tendrá que crear una instancia del objeto antes de usar una función pública. Así que voy a ser exhaustivo y le haré saber que para usar una función en una clase sin instanciar un objeto, asegúrese de usar la siguiente sintaxis:
static function foo($arg1, $arg2) { /*function stuff goes here */ }
Eso le permitirá usar la función solo haciendo referencia a la clase, de la siguiente manera:
MyClass::foo($a1, $a2);
De lo contrario, deberá hacer lo siguiente:
$myObject = new MyClass();
$myObject->foo($a1, $a2);
¿Hay algún equivalente de "amigo" o "interno" en php? Si no, ¿hay algún patrón a seguir para lograr este comportamiento?
Editar: Lo siento, pero Php estándar no es lo que estoy buscando. Estoy buscando algo en la línea de lo que hizo el maestro de ceremonias.
Tengo clases que están haciendo llamadas al sistema estilo C en la parte de atrás y el malabarismo ha comenzado a ser engorroso. Tengo funciones en el objeto A que toman el objeto B como un parámetro y tienen que llamar a un método en el objeto B que pasa en sí mismo como un argumento. El usuario final podría llamar al método en B y el sistema se derrumbaría.
PHP no admite ninguna declaración tipo amigo. Es posible simular esto usando los métodos __get y __set de PHP5 e inspeccionando una traza inversa solo para las clases de amigos permitidas, aunque el código para hacerlo es algo torpe.
Hay un ejemplo de código y discusión sobre el tema en el sitio de PHP:
class HasFriends
{
private $__friends = array(''MyFriend'', ''OtherFriend'');
public function __get($key)
{
$trace = debug_backtrace();
if(isset($trace[1][''class'']) && in_array($trace[1][''class''], $this->__friends)) {
return $this->$key;
}
// normal __get() code here
trigger_error(''Cannot access private property '' . __CLASS__ . ''::$'' . $key, E_USER_ERROR);
}
public function __set($key, $value)
{
$trace = debug_backtrace();
if(isset($trace[1][''class'']) && in_array($trace[1][''class''], $this->__friends)) {
return $this->$key = $value;
}
// normal __set() code here
trigger_error(''Cannot access private property '' . __CLASS__ . ''::$'' . $key, E_USER_ERROR);
}
}
(Código probado por tsteiner en nerdclub dot net en bugs.php.net )
También es posible elevar los privilegios, también conocido como filtrado de datos de forma selectiva, utilizando un apretón de manos y cierres en php> = 5.3.3.
Básicamente, la interacción es válida: la clase A tiene un método público que acepta un objeto de clase B y llama a B-> grantAccess (o lo que sea que defina su interfaz), pasándole un cierre. El use($that,$anythingelseyouneed)
cierre use($that,$anythingelseyouneed)
donde $ that = $ this, y cualquier otra cosa que necesites determinar a qué propiedades se les permite acceder. El cierre tiene un argumento: la propiedad de regresar; si es una propiedad en $ que y todo está bien, el cierre devuelve la propiedad. De lo contrario, devuelve '''', o arroja una excepción, o tal vez un valor predeterminado.
La clase B-> grantAccess acepta un invocable y lo almacena, usándolo en otros métodos para arrancar propiedades privadas, el cierre permite ser filtrado. Haga que el constructor predeterminado de la clase B sea privado. Construya una B usando un método de fábrica estático que tome un argumento Clase A, para garantizar que se produzca el intercambio de información.
Gist aquí: https://gist.github.com/mcamiano/00592fb400e5043d8acd