Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

294
Vistas
¿Qué es la inspección "Agregar atributo #[Puro]" en la comprobación de PhpStorm?

Tengo una clase FormRequest muy simple en un proyecto de Laravel. Dos métodos, los cuales devuelven una matriz simple que está parcialmente poblada por un método, pero el IDE los trata de manera diferente.

 <?php namespace App\Http\Requests; class VerifyPhoneNumber extends FormRequest { use Support\ValidatesPhoneNumbers; public function authorize(): bool { return true; } public function rules(): array { return [ "phone_number" => $this->getPhoneNumberRules(), "verify_code" => ["required", "numeric", "max:999999"], ]; } public function messages(): array { return [ "phone_number.regex" => $this->getPhoneNumberMessage(), ]; } }

Y los métodos de rasgos muy básicos:

 <?php namespace App\Http\Requests\Support; trait ValidatesPhoneNumbers { protected function getPhoneNumberMessage(): string { return __("Some localized error message"); } protected function getPhoneNumberRules(): array { return ["regex:/^\+?1?[2-9][0-9]{5,14}$/", "max:16"]; } }

Lo que me desconcierta es que la inspección del IDE se queja de que debería agregar el atributo JetBrains\PhpStorm\Pure al método rules() , pero no al método de messages() .

Los comentarios en la definición de clase dicen:

El atributo marca la función que no tiene impacto en el estado del programa o los parámetros pasados utilizados después de la ejecución de la función. Esto significa que una llamada de función que se resuelve en dicha función se puede eliminar de forma segura si el resultado de la ejecución no se usa en el código posteriormente.

Eso realmente no me da ninguna pista de por qué trata estos dos métodos de manera diferente. Si entiendo la segunda oración correctamente, cuando el resultado de un método "puro" no se usa, el IDE marcará el uso del método como no usado y recomendará su eliminación.

¿Cuál es la lógica utilizada para determinar cuándo se necesita este atributo?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

El método rules() tiene un resultado fijo (mejor dicho "sin efectos secundarios" ): solo usa valores fijos. Claro, llama a getPhoneNumberRules() desde un rasgo pero también devuelve una matriz fija (siempre la misma). No realiza cambios en ningún otro lugar (estado interno o almacenamiento externo).

El método de messages() llama a un método de un rasgo que llama a __() para obtener un mensaje traducido... que puede provenir de una fuente diferente (una base de datos, un archivo) y, por lo tanto, potencialmente puede generar excepciones si un almacenamiento (archivo/base de datos ) no es legible. El IDE no sabe con certeza si __() realiza cambios en un archivo/base de datos; no está anotado como puro y PhpStorm no puede tomar tal decisión a partir de los métodos que utiliza.


PD : si esta inspección le molesta (lo que puedo entender), le sugiero que simplemente la ignore y reduzca su gravedad en Configuración de PhpStorm a "Sin resaltar, solo corregir" ( Settings (Preferences on macOS) | Editor | Inspections | PHP | Attributes | '#[Pure]' attribute can be added )

over 4 years ago · Santiago Trujillo Denunciar

0

Si una función solo depende de otras funciones puras, entonces también es pura. Dado que getPhoneNumberRules() solo devuelve una matriz fija, es puro, por lo que rules() también es puro.

Pero messages() llama a getPhoneNumberMessage() , que llama a la función __() que puede devolver un mensaje localizado diferente si cambia el estado de la ubicación, por lo que no es puro.

over 4 years ago · Santiago Trujillo Denunciar

0

Utilice este atributo para funciones que no produzcan efectos secundarios. Todas estas funciones internas de PHP ya están marcadas en PhpStorm.

 #[Pure] function compare(Foo $a, Foo $b): int { return $a->a <=> $b->b; }

Fuente: https://github.com/JetBrains/phpstorm-attributes#pure

Como esta función solo hace algo por sí misma, se la puede llamar función #[Pura] y eso lo sabes a través de PhpStorm.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda