ordenar - obtener el indice de un array php
Sugerencia de tipos de PHP: matriz compatible, objeto ¿NO? (9)
¿Por qué querría insinuar un object
cuando puede insinuar un nombre de clase real? Esto sería mucho más útil. También recuerda que tampoco puedes insinuar int
, float
, bool
, string
o resource
.
¿Me estoy perdiendo algo o realmente no hay soporte para sugerencias de tipo de objeto genérico en PHP 5.x?
Me parece realmente extraño que las matrices de sugerencias se admitan, mientras que las de objetos no lo son, al menos no fuera de la caja.
Me gustaría tener algo como esto:
function foo(object $o)
Así como tenemos:
function foo(array $o)
Ejemplo de uso posible: métodos de una clase de colección de objetos.
Solución alternativa: usar una interfaz "Objeto" implementada por todas las clases o extender todas las clases de una clase genérica "Objeto" y escribir algo como esto:
function foo(Object $o)
Bueno, eso no es lindo.
Usar stdClass
como la sugerencia de tipo no funciona:
Error fatal detectable: el argumento 1 pasado a c :: add () debe ser una instancia de stdClass, instancia de b dada
Aquí hay otro ejemplo donde se requiere ...
He creado una clase para implementar el bloqueo de registros. Los registros son uno de varios tipos de objetos diferentes. La clase de bloqueo tiene varios métodos que requieren un objeto (el que está bloqueado) pero no importa qué tipo de objeto es.
P.ej
public static function lockRecord($record, User $user, $timeout=null)
{
if(!is_object($record)) throw new /InvalidException("Argument 1 must be an object.");
$lock=new Lock();
$lock->setRecord($record);
$lock->setUser($user);
$lock->setTimeout($timeout);
$lock->activate();
return($lock);
}
Verás que mi solución fue usar is_object () y lanzar una excepción, pero preferiría hacerlo con sugerencias de tipo.
Ok, entonces no es el fin del mundo, pero creo que es una pena.
Dado que las sugerencias de tipo deben hacer que el código del cliente se adapte a su API, su solución con la aceptación de interfaces parece correcta.
Mírelo de esta manera: su yourMethod(array $input)
le da a su yourMethod()
una matriz para usar, por lo que usted sabe exactamente qué funciones nativas se aplican y pueden ser utilizadas por su yourMethod()
.
Si especifica su método como: su yourSecondMethod(yourInterface $input)
, también sabría qué métodos se pueden aplicar a la $input
ya que conoce / puede buscar qué conjunto de reglas acompaña a la interfaz de su yourInterface
.
En su caso, aceptar cualquier objeto parece incorrecto, porque no tiene forma de saber qué métodos usar en la entrada. Ejemplo:
function foo(Object $o) {
return $o->thisMethodMayOrMayNotExist();
}
(No implica que la sintaxis sea válida)
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 tus clases base, puedes implementar Object
.
class SomeBase implements Object {
// your implementation
}
Ahora puedes llamar a tu función como quisieras
function myFunc (Object $obj);
myFunc($someBase);
Si pasa cualquier objeto que herede de su interfaz de Object
, esta sugerencia de tipo pasará. Si pasa una matriz, int, cadena, etc., la sugerencia de tipo fallará.
Los objetos en php no son subclases de algunos StdClass u Object como lo están en otros lenguajes OOP. Así que no hay forma de tipear el objeto. Pero veo tu punto porque a veces quieres asegurarte de que se pasa el Objeto, así que supongo que la única forma es plantear el problema manualmente.
public function yourFunction($object){
if(is_object($object)){
//TODO: do something
}else{
throw new InvalidArgumentException;
}
}
A partir de PHP 5.4 también hay una sugerencia de tipo invocable . Consulte el manual de php http://php.net/manual/en/language.types.callable.php
No puede simplemente decir "objeto" cuando escriba un objeto ... debe definir QUÉ objeto espera.
De: http://php.net/manual/en/language.oop5.typehinting.php
class MyClass
{
/**
* A test function
*
* First parameter must be an object of type OtherClass
*/
public function test(OtherClass $otherclass) {
echo $otherclass->var;
}
/**
* Another test function
*
* First parameter must be an array
*/
public function test_array(array $input_array) {
print_r($input_array);
}
}
// Another example class
class OtherClass {
public $var = ''Hello World'';
}
No, no se puede hacer. No me estaba perdiendo nada.
Siento tu dolor, pero tampoco puedo encontrar una manera de hacerlo.
A pesar de lo que han dicho otros carteles, tiene mucho sentido querer insinuaciones de tipo ''Objeto''; simplemente no han considerado un escenario que lo requiera.
Estoy tratando de hacer algún trabajo con la API de reflexión, y por eso no me importa qué clase se pasa a mi función. Todo lo que me importa es que es un objeto. No quiero un int, un float, una cadena o una matriz. Quiero un objeto Dado que la reflexión ahora es parte de PHP, definitivamente tiene sentido tener sugerencias de tipo de objeto.
public static function cloneObject($source)
{
if ($source === null)
{
return null;
}
return unserialize(serialize($source));
}
Aquí es donde lo necesitarías.