Req #67830 [Opn]: PropertyReflection->setAccessible(false) not affecting public properties
| From: | levim@php.net | Date: | Thu, 14 Aug 2014 04:17:27 +0000 |
| Subject: | Req #67830 [Opn]: PropertyReflection->setAccessible(false) not affecting public properties | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-187106@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=67830&edit=1
ID: 67830
Updated by: levim@php.net
Reported by: leuffen at continue dot de
Summary: PropertyReflection->setAccessible(false) not
affecting public properties
Status: Open
Type: Feature/Change Request
Package: Reflection related
Operating System: Linux
PHP Version: 5.5.15
Block user comment: N
Private report: N
New Comment:
As a general PHP user I am shocked that you use it like this. Clearly abuse in my opinion.
From a dev perspective, it probably should be supported if we claim it is supported in
documentation. If not, it's just a bad API and we should change the API.
Previous Comments:
------------------------------------------------------------------------
[2014-08-12 14:33:38] leuffen at continue dot de
Description:
------------
At present ReflectionProperty::setAccessible() works only one-way: Changing unaccessible Properties
to accessible. setAccessible(false) will have no affect. This is complicated for frameworks using
__get() and __set():
Our frameworks use the magic __get() and __set() methods to validate data or to load Entities from
Database.
To take advantage from common IDE's code-completion we declare these properties public and
unset them whithin the constructor (and store the actual data whithin a private or protected
property).
It would be a great advantage for working with these Objects if we could use the
ReflectionProperty::setAccessible() Method to change property visibility to private and enforce use
of __get() and __set() methods.
Test script:
---------------
class Entity {
public $name = "direct access";
public function __construct() {
$ref = new ReflectionObject($this);
foreach ($ref->getProperties() as $prop) {
$prop->setAccessible(FALSE);
}
}
public function __get($name) {
return "access over __get()";
}
}
$o = new Entity();
echo $o->name;
Expected result:
----------------
"access over __get()"
Actual result:
--------------
"direct access"
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=67830&edit=1