with strip_tags remove ent_quotes ejemplo php type-hinting

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

RFC: tipo de objeto

Discussion

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
John

Error 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.