Introspección
Al trabajar con clases y objetos, existen un conjunto de funciones ya definidas por el lenguaje que permiten obtener información sobre los objetos:
instanceof: permite comprobar si un objeto es de una determinada claseget_class: devuelve el nombre de la claseget_declared_class: devuelve un array con los nombres de las clases definidasclass_alias: crea un aliasclass_exists/method_exists/property_exists:truesi la clase / método / propiedad está definidaget_class_methods/get_class_vars/get_object_vars: Devuelve un array con los nombres de los métodos / propiedades de una clase / propiedades de un objeto que son accesibles desde dónde se hace la llamada.
Un ejemplo de estas funciones puede ser el siguiente:
<?php
$p = new Producto("PS5");
if ($p instanceof Producto) {
echo "Es un producto";
echo "La clase es ".get_class($p);
class_alias("Producto", "Articulo");
$c = new Articulo("Nintendo Switch");
echo "Un articulo es un ".get_class($c);
print_r(get_class_methods("Producto"));
print_r(get_class_vars("Producto"));
print_r(get_object_vars($p));
if (method_exists($p, "mostrarResumen")) {
$p->mostrarResumen();
}
}
Clonado
Al asignar dos objetos no se copian, se crea una nueva referencia. Si queremos una copia, hay que clonarlo mediante el método clone(object) : object
Si queremos modificar el clonado por defecto, hay que definir el método mágico __clone() que se llamará después de copiar todas las propiedades.
Más información en https://www.php.net/manual/es/language.oop5.cloning.php