Как сообщить PhpStorm о деталях реализации? (магические методы)

У меня есть объект «Пользователь», у которого есть атрибуты, доступность которых объявлена ​​как защищенная, но которые можно установить напрямую с помощью магического метода __set.

введите здесь описание изображения

Теперь PhpStorm сигнализирует об этом очевидном несоответствии большим красным столбцом справа.

Можно ли объяснить PhpStorm, что происходит, чтобы это больше не отображалось как ошибка?


ИЗМЕНИТЬ:

Я использую PhpStorm 2.1.4.

Хорошо, вот некоторый код, который иллюстрирует проблему (вместе с предложенным до сих пор обходным путем от Алексея, который, к сожалению, не делает этого для меня):

c.php:

<?php
/**
 * @property mixed $a
 */
class c1
{
    protected $a;

    public function __construct() { $this->a = __CLASS__; }

    public function __get($n) { return $this->{$n}; }
}

/**
 * @property $a mixed
 */
class c2
{
    protected $a;

    public function __construct() { $this->a = __CLASS__; }

    public function __get($n) { return $this->{$n}; }
}

test.php

<?php
require "c.php";

$c1 = new c1();
var_dump($c1->a);

$c2 = new c2();
var_dump($c2->a);

и вывод:

string 'c1' (length=2)
string 'c2' (length=2)

и как это выглядит в PhpStorm:

введите здесь описание изображения

моя цель:

либо заставить PhpStorm «понимать» дизайн, либо просто избавиться от этих надоедливых красных меток повсюду, не ухудшая при этом обнаружение ошибок, кроме этой проблемы.


person Raffael    schedule 04.10.2011    source источник


Ответы (1)


Теперь это работает в PHPStorm 3 :)

К сожалению, это открытый запрос в нашем трекере, см. http://youtrack.jetbrains.net/issue/WI-4468

Единственный способ избежать этих предупреждений сейчас — добавить @property к объявлению класса $user. то есть

/**
 * @property $name string
 */
class User {
    protected $name; 
}
$user = new User();
$user->name = "me";
person Alexey Gopachenko    schedule 05.10.2011
comment
обходной путь не меняет того, что PHPStorm интерпретирует доступ как ошибочный. - person Raffael; 19.10.2011
comment
Ну, я добавил полный пример. И я разработчик этих проверок в IDE. Если у вас не работает - зайдите на наш трекер и предоставьте свой код для воспроизведения. - person Alexey Gopachenko; 20.10.2011
comment
Что, если это перегруженный метод, а не свойство (с таким же именем), определенное как защищенное? protected function foo($a, $b); и public function __call($m, $p) Я не могу обойти эту ошибку, не изменив имена всех методов. - person Keyne Viana; 12.03.2012
comment
Итак, как сказать IDE скрыть эти проверки без изменения аннотаций исходного класса? т.е. исходный класс имеет защищенные методы/поля, но с помощью некоторых магических преобразований они становятся общедоступными и гарантированно работают. Как скрыть эти галочки и красные отметки? - person Alexander Pravdin; 21.12.2014