PhpStorm Field accedido a través del método mágico

5 minutos de lectura

avatar de usuario
Código chisporroteante

Encendí la biblioteca de tablas de datos en mi carpeta de la biblioteca CodeIgniter.

Algo de código de la biblioteca

class Datatables
{
    /**
     * Global container variables for chained argument results
     *
     */
    protected $ci;
    protected $table;
    protected $distinct;
    protected $group_by;
    protected $select         = array();
    protected $joins          = array();
    protected $columns        = array();
    protected $where          = array();
    protected $filter         = array();
    protected $add_columns    = array();
    protected $edit_columns   = array();
    protected $unset_columns  = array();

    /**
     * Copies an instance of CI
     */
    public function __construct()
    {
        $this->ci =& get_instance();
    }

Luego llamé a la biblioteca en modelo.

class Common_Model extends MY_Model{

    function __construct(){
        parent::__construct();
        $this->load->library('Datatables.php');
    }

luego traté de llamar a las funciones de la biblioteca

function select_fields_joined_DT($data, $PTable, $joins="", $where="", $addColumn = '',$unsetColumn='')
{
    /**
     *
     */
    $this->datatables->select($data);
    if ($unsetColumn != '') {
        unset_column($unsetColumn);
    }
        $this->datatables->from($PTable);
    if ($joins != '') {
        foreach ($joins as $k => $v) {
            //$this->datatables->join($v['table'], $v['condition'], $v['type']);
        }
    }

    if ($addColumn != '') {
        $this->datatables->add_column("Actions", $addColumn);
    }

    $result = $this->datatables->generate();
    return $result;
}

y todo funciona bien, excepto que el phpstorm me muestra este error:

Field Accessed via magic method

ingrese la descripción de la imagen aquí

Traté de eliminar este error con los comentarios del documento, pero no sé cómo puedo hacerlo… cualquier ayuda será apreciada.

  • Tienes que declararlos a través de @property en el comentario de PHPDoc que pertenece a esa clase.

    – LazyOne

    30 de agosto de 2014 a las 9:33

  • ¿Hay alguna forma de hacer esto sin tocar el archivo en el que se declara la clase? Por ejemplo, si la clase es parte de una biblioteca de terceros y no quiero hacer parches personalizados para ese código solo para agregar estos @property comentarios?

    – Eno

    3 de julio de 2019 a las 9:43

  • @Enno ¿Encontraste una respuesta a tu pregunta? Yo también tengo el mismo problema que el tuyo. La única forma que se me ocurre es crear una clase que amplíe la clase de terceros y luego agregar la @property? Aunque no estoy seguro de si funcionará.

    – Markandrewkato

    9 jun 2020 a las 13:50

  • @markandrewkato Creo que depende mucho de tu situación si puedes extender la clase o no. En mi caso no fue posible y la verdad es que ya no recuerdo lo que hice.

    – Eno

    10 de junio de 2020 a las 12:32

  • @Enno No hay problema. Como no puedo agregar un documento a un tercero y tampoco quiero extenderlo, solo seguí la respuesta a continuación. ¡Gracias!

    – Markandrewkato

    11 de junio de 2020 a las 16:17

avatar de usuario
crissan

Editar: solo porque sigo recibiendo votos positivos por esto, quiero comenzar esta respuesta con una advertencia. Heredé un proyecto antiguo en el que no estaría trabajando a largo plazo ni me pagarían para escribir todo correctamente. Considero que lo siguiente es una opción nuclear y solo lo haría en condiciones similares. Si este es un proyecto de su propiedad o al menos trabajará durante mucho tiempo, especialmente en la era moderna de PHP 7/8 y posteriores, no haga esto y ordene su código con tipos reales o al menos un docblock: ) La respuesta original sigue a continuación.

Si desea eliminar esto sin comentarios del documento, puede desmarcar Notificar sobre el acceso a una propiedad a través del método mágico que se encuentra en

Configuración del proyecto > Inspecciones > PHP > Indefinido > propiedad indefinida

Notificar sobre el acceso a un campo a través del método mágico

Captura de pantalla de preferencias de PhpStorm

  • Sin saber si reír o llorar. Cambié de Idea a phpstorm independiente recientemente y, teniendo este problema nuevamente, busqué en Google esta notificación para encontrar esta SO pregunta. No me gustó la respuesta votada y encontré que el comentario de @LazyOne era lo que estaba buscando. Entonces me di cuenta de que esta respuesta era mía…

    – chrisan

    3 de abril de 2017 a las 11:53


  • Hice del comentario de LazyOne una respuesta de la comunidad. Siéntase libre de agregar o corregir la información.

    –Emile Bergeron

    11 de abril de 2017 a las 17:19

  • Bien hecho. Ahora me enfrento a este problema. Estoy un poco acostumbrado a PyCharm con las relaciones de Python, por supuesto. Soy nuevo en PhpStorm. Fue fácil encontrar esta ruta y desmarcar Propiedad indefinida. Esto es bueno porque mientras trabajo con Laravel… ¡sucede todo el tiempo! ¡Muchas gracias!

    – Bitart

    13 de junio de 2021 a las 13:41

  • @Bitart echa un vistazo github.com/barryvdh/laravel-ide-helper Ya no me encuentro con indefinidos con eso

    – chrisan

    14 de junio de 2021 a las 16:18

  • No pude evitar reírme del comentario de Chrisan.

    – Jasonfish

    31 oct 2021 a las 14:18

Como lo menciona LazyOne en los comentarios de la pregunta:

Tienes que declararlos a través de @property en el comentario de PHPDoc que pertenece a esa clase.

/**
 * @property string $bar
 */
class Foo {

    public function __get($name) {
        if ($name == 'bar') {
            return 'bar';
        }
        return NULL;
    }
}

Fragmento del artículo de Dmitry Dulepov “Consejo rápido: métodos mágicos y PhpStorm”.

  • El enlace al artículo ya no es válido.

    –Craig Londres

    13 de noviembre de 2017 a las 13:33

  • @CraigLondon, el artículo no es necesario ya que todo está en la respuesta y el enlace solo se proporcionó como fuente. Aún así, lo actualicé con un máquina de camino enlace de instantánea.

    –Emile Bergeron

    13 de noviembre de 2017 a las 16:42

  • Sinceramente, me gusta mucho más esto que la respuesta elegida. Ofrece una manera de decir explícitamente lo que podemos esperar de una clase en lugar de dejarlo todo en manos de la magia y los posibles errores de tipeo.

    – Chris

    25 de noviembre de 2018 a las 11:50


Si no desea deshabilitar la inspección de todo el proyecto y no puede modificar el archivo de clase para agregar un @property etiqueta, esta es la forma de suprimir la advertencia en el lugar donde se utiliza:

/** @noinspection PhpUndefinedFieldInspection */

Simplemente agréguelo en una nueva línea justo antes de la línea donde se usa el campo mágico.

La respuesta de @christian sigue siendo válida, pero la ruta para deshabilitar la inspección cambió recientemente.

Aquí está el nuevo:

Preferencias > Editor > Inspecciones > PHP > Símbolos no definidos > Propiedad no definida

Luego deshabilite “Notificar el acceso a una propiedad a través del método mágico”.

¿Ha sido útil esta solución?