JakubMisek how about allowing the user to configure this by adding special control comments to a class (or attributes) like eg:
/** phptools:strict-properties=true */
class MyClass
{
…
JakubMisek how about allowing the user to configure this by adding special control comments to a class (or attributes) like eg:
/** phptools:strict-properties=true */
class MyClass
{
…
UweKeim Other tools enable this diagnostic by default, letting users to disable it if they want to.
But PHPDoc tag is a good option, since we already have @suppress
support (https://docs.devsense.com/en/vs/code%20validation/configuration#suppress-phpdoc-tag)
UweKeim we have added diagnostics and suggestions for unknown properties!
It is available in the 1.67
preview version at https://www.devsense.com/download
Thank you so much, Jakub!
I've just installed and tried it and it seems to simply work out-of-the-box.
I've searched through the settings/options of PHP Tools in the Tools → Options dialog but found none regarding this feature that visualizes unknown properties.
Are there any options or PHPDoc tags, or does it "simply work"?
Thanks again for making my big wish come true 😊
thanks for trying it so quickly!
right, there is no configuration (except for various options on how to disable this diagnostic https://docs.devsense.com/en/vs/code%20validation/configuration) :)
__get()
method)strict_types=1
is respected - this affects numeric type conversions (bool <-> int <-> float <-> string)I now have a case like this:
class MyClass
{
public function foo()
{
$this->nonExisting = true;
}
}
In the above, it correctly underlines nonExisting
.
Consider this case:
class MyClass
{
public function foo()
{
$this->nonExisting = true;
}
public function __get(string $name)
{
return null;
}
}
Now, as you described in your solution, the nonExisting
is not underlined anymore.
Still, I would consider this to be something that PHP Tools should report as an error and underline.
Reason is that I do an assignment to the variable (i.e. no read) and I do not provide a __set
magic method.
Is it possible for your engine to detect and report those cases, please?
It is possible, and it makes sense to do so. We'll take a look on that and I'll keep you informed in this thread,
Thank you!
Implemented respecting __get
and __set
- this will get pre-released within upcoming days :-)
JakubMisek Is it possible to get missing property warning even if the __get magic method exists? I would like to define all existing properties via @property [type] [name] even if the __get method exists and suppress the warning for the classes that I choose.
TauriT maybe .. if there is some @property
tag, then missing properties should be checked even if there is the __get
magic method.
We'd like to avoid falsy warnings for the other users and common composer packages.
JakubMisek Does not seem to work correctly or am I missing something?
TauriT yes, we didn't implement it yet :)
JakubMisek There seem to be even bigger issues regarding @property annotations. It is not recognising basic properties in some cases but I have not managed to pull simplified example out of my main project.
TauriT we can add a diagnostic for that! :)
implemented - undefined property will be reported even there is __get
/__set
if there are already some @property
in doc blocks defined.
we have also added diagnostic for incorrectly defined @property
(with missing property $name)
@JakubMisek Hi, about this feature:
implemented - undefined property will be reported even there is
__get/__set
if there are already some@property
in doc blocks defined.
I think you need to implement a workaround when we have a class with __get/__set
and some static properties like for a timer class start
and stop
but also with dynamic properties like checkpoints.
Is it possible to have a wildcard property for example?
/**
* @property int $start
* @property int $stop
* @property int $*
*/
Thank you
Jean-FrancoisHIVERT Is it something already used somewhere? I'd prefer to use some standard notation.
I believe wildcard does not exist so it is normal do not implement that.
Is it possible to implement something else?