php - strip_tags - Escriba sugerencias para cualquier objeto
strip_tags wordpress (9)
A partir de php 7.2 esta característica ha sido implementada. puede escribir sugerencia para cualquier objeto ahora.
function myFunc(Object $myObject) : Object {
return $myObject;
}
Puede revisar esto en la documentación oficial
He estado trabajando en un código que está destinado a ser usado con objetos, sin preocuparse realmente por el tipo de objeto. Quería escribir la sugerencia de que el método que se está escribiendo esperaba un objeto de cualquier tipo, pero se encontró con alguna dificultad.
Intenté la function myFunc (object $obj)
y la function myFunc (stdClass $obj)
pero ambos generaron errores cuando traté de pasar objetos en:
Error fatal acumulable: el argumento 1 pasado a MyClass :: MyFunc () debe ser una instancia de objeto, instancia de ObjectActualClass dado
Lo mismo ocurrió con stdClass
¿Qué me estoy perdiendo? Pensé que todas las clases que no heredaban explícitamente de otra clase heredaban de stdClass
, lo que significa que la clase base de cada clase en PHP sería stdClass
. ¿No es este el caso?
Aunque no hay sugerencias de tipo para objetos, puede usar:
if (!is_object($arg)) {
return;
}
Bueno, solo tomó ocho años, pero esto pronto será posible: ¡PHP 7.2 introduce la sugerencia de tipo de object
! Mientras escribo esto, se encuentra actualmente en la etapa de RFC, y se lanzará en noviembre .
Actualización, 30 de noviembre: PHP 7.2 ha sido lanzado
Esto se comporta exactamente como cabría esperar:
<?php
class Foo {}
class Bar {}
function takeObject(object $obj) {
var_dump(get_class($obj));
}
takeObject(new Foo);
takeObject(new Bar);
takeObject(''not an object'');
Resultará en:
cadena (3) "Foo"
cadena (3) "Barra"
Error fatal: UnEught TypeError: El argumento 1 pasado a takeObject () debe ser un objeto, cadena dada, llamada en ...
Un efecto secundario de esto es que el object
es ahora una palabra reservada, lo que desafortunadamente hace que se rompa la solución existente de @Gaz_Edge.
La mejor manera de hacer cumplir esto sería crear una interfaz degenerada llamada Object
. Una interfaz degenerada significa que no tiene métodos definidos.
interface Object {
// leave blank
}
Luego, en sus clases base, puede implementar Object
.
class SomeBase implements Object {
// your implementation
}
Ahora puede llamar a su función como lo desea
function myFunc (Object $obj);
myFunc($someBase);
Si pasa cualquier objeto que herede de su interfaz de Object
, esta sugerencia de tipo pasará. Si transfiere una matriz, int, cadena, etc., la sugerencia de tipo fallará.
No existe una clase base desde la cual se extiendan todos los objetos. Solo debe eliminar el tipo de letra y documentar el tipo esperado en la anotación @param
.
No hay un mecanismo incorporado para hacer esto sin requerir que todos los usuarios de su interfaz extiendan una clase especificada. ¿Pero por qué querrías hacer esto de todos modos? ¿Qué tienen en común todos los tipos de objetos que sean suficientes para hacerlos una entrada adecuada para su API?
Con toda probabilidad, no ganarías nada aunque pudieras escribir una pista como esta. Por otro lado, escribir insinuar un parámetro para implementar una interfaz (como Traversable
) sería mucho más significativo.
Si aún desea algo similar a la tipificación de tipo, lo mejor que puede hacer es sustituir una is_object
tiempo de ejecución con is_object
en el parámetro.
Podrías hacer algo como esto:
function myFunc ($obj)
{
if ($obj instanceof stdClass) { .... }
}
Typehint for stdClass
funciona desde PHP 5.3+ (si no estoy equivocado). Lo siguiente es un código válido usando typehint para la construcción stdClass
:
Ejemplo test.php
:
class Test{
function hello(stdClass $o){
echo $o->name;
}
}
class Arg2 extends stdClass{
public $name = ''John'';
function sayHello(){
echo ''Hello world!'';
}
}
$Arg1 = new stdClass();
$Arg1->name = ''Peter'';
$Arg2 = new Arg2();
$Arg2->sayHello();
$test = new Test();
// OK
$test->hello($Arg1);
$test->hello($Arg2);
// fails
$test->hello(1);
Imprime:
¡Hola Mundo!
Peter
JohnError catastrófico fatal: el argumento 1 pasado a Test :: hello () debe ser una instancia de stdClass, entero dado, llamado en test.php en la línea 32 y definido en test.php en la línea 5
stdClass NO es una clase base! Las clases de PHP no heredan automáticamente de ninguna clase. Todas las clases son independientes, a menos que extiendan explícitamente otra clase. PHP difiere de muchos lenguajes orientados a objetos en este aspecto.