Cuándo usar PHP stdClass

El siguiente código proviene de la biblioteca recaptcha de Google. En lugar de usar stdClass, usaron una clase separada. Entiendo por qué esto sería útil si fueran propiedades de configuración previa (ya sea para un valor determinado o incluso NULO), pero no veo por qué lo hicieron en este caso. ¿Hay algún valor para hacerlo como lo hicieron, o stdClass sería más apropiado?

class ReCaptchaResponse { var $is_valid; var $error; } $recaptcha_response = new ReCaptchaResponse(); $recaptcha_response->is_valid = false; $recaptcha_response->error = 'incorrect-captcha-sol'; 

Esto es en parte una cuestión de opinión, pero personalmente nunca he usado stdClass , y nunca he entendido el sentido de hacerlo.

El objective de un objeto es encapsular datos y comportamientos, ya sea añadiendo métodos públicos y privados al objeto, usando herencia y polymorphism para estructurar su proyecto, o simplemente teniendo un tipo con nombre bien definido.

En algunos idiomas, por ejemplo, JavaScript, un objeto es útil como un almacén de clave-valor de propósito general, incluso si las propiedades se agregan completamente ad hoc; en PHP, ese rol puede ser llenado simple y efectivamente por una matriz asociativa.

Algunas personas usarán objetos stdClass como tiendas de clave-valor, pero perderán el uso de todas las funciones en torno a las matrices al hacerlo. Como señala ZubaiR arriba, un objeto se pasará / asignará como un tipo de puntero ( no es lo mismo que pasar una variable por referencia) en lugar de copiarse según sea necesario, por lo que se comportará de manera diferente , pero si no está usando deliberadamente el ” “aspecto de encapsulación” de OOP (en cuyo caso probablemente crearía una clase), es difícil decir si esto es algo bueno o simplemente una posibilidad de confusión.

En otros lenguajes, como C, hay una forma de definir tipos de “struct” personalizados, con miembros nombrados predefinidos. PHP no tiene ese tipo, pero una clase sencilla sin método como la que muestra es bastante cercana.

Otra ventaja en otros idiomas que no se aplica en PHP es que la clase base para objetos podría tener alguna funcionalidad, o incluso, como en JavaScript o Ruby, le permite agregar alguna funcionalidad. En PHP, stdClass es completamente inerte y no se puede editar, y como se señaló en otro lugar, de hecho no se usa como una clase base para otros objetos; su única habilidad “mágica” es ser la clase objective cuando algo se lanza o “malabariza” para que sea de tipo object .

Los beneficios inmediatos de usar una clase con nombre incluyen:

  • el motor de PHP, y herramientas como IDE y sniffers de código, saben qué propiedades “deberían” existir, y pueden advertirle si establece las no válidas, por ejemplo, a través de un error de ortografía
  • puede verificar si un valor particular aprobado es el tipo correcto de objeto (usando instanceOf ) en lugar de
  • puede expandir el objeto fácilmente más tarde para tener una funcionalidad adicional, o hacer que forme parte de una jerarquía de herencia, etc.

¿Hay algún valor para hacerlo como lo hicieron, o stdClass sería más apropiado?

  1. ReCapchaResponse es más fácil de usar que stdClass
  2. Agrega la posibilidad de extender la clase en el futuro sin modificar otras secciones.

¿Por qué usar stdClass en absoluto? ¿No podemos usar arreglos para todos los mismos casos?

Si desea pasar datos de una función a otra y también modificar los datos, puede usar stdClass. Puede hacer lo mismo con la matriz asociativa, pero luego tiene la posibilidad de un error si pierde la llamada por referencia.

 $a = array(); function test1(&$a) { $a['key'] = 1234; } test($a); function test2($a) { // possible error $a['key'] = 1234; } test2($a); $a = new stdClass(); function test3($a) { $a->key = 1234; } test3($a); 

Pero este tipo de estructura es altamente improbable en el escenario práctico.

ReCaptchaResponse es más fácil de leer y más comprensible que stdClass .

Pero programáticamente es lo mismo.

Por ejemplo, piense en esta clase como interfaz y extensibilidad en el futuro. ReCaptchaResponse también es stdClass.

Deberías preguntarle al autor sobre su idea.