Hello @leenooks
This is default functionality for PHP, see: https://www.php.net/manual/en/language.oop5.overloading.php
The most important part is:
__isset() is triggered by calling isset() or empty() on inaccessible (protected or private) or non-existing properties.
It doesn't load execute a __GET() to only see if the variable is set.
So in basic: If you implement the __GET() function it is advisable to implement the __ISSET function.
You are right that the issue is rooted in the isset() method. The isset() method only checks for the existence of a public property or a public variable. If the attribute is accessed via the __get() method, the isset() method will not be able to detect it.
The workaround you mentioned is correct. You can create an __isset() method on the object to return true if the attribute is accessible via __get(). This will allow the pluck method to work correctly, even if the attribute is accessed via __get().
I agree that this is a shortcoming in Laravel. The pluck method should be able to check if an attribute is accessible via __get(), even if it is not defined as a public property.
I also think that the __isset() method is a good workaround. It is simple to implement and it works reliably. I would recommend using this workaround until the Laravel team fixes the issue.
Sign in to participate in this thread!
The Laravel portal for problem solving, knowledge sharing and community building.