php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #34893 PHP5.1 overloading, Cannot access private property
Submitted: 2005-10-17 16:58 UTC Modified: 2005-10-20 11:48 UTC
Votes:2
Avg. Score:3.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: kai at meder dot info Assigned: helly (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 5.1.0RC1 OS: *
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: kai at meder dot info
New email:
PHP Version: OS:

 

 [2005-10-17 16:58 UTC] kai at meder dot info
Description:
------------
chaining of objects using __get() works like a charm, however if using chaining and using __set() at the end of the chain to set a property, php fails reporting: "Fatal error: Cannot access private property A::$p in <file> on line <line>"

please keep in mind that i'm using php5.1 (RC1), chaining should work in this version, doesn't it?

posted reproduce code from http://www.sitepoint.com/forums/showthread.php?p=2230679#post2230679


Reproduce code:
---------------
class A {
	private $p;
	function __get($name){
		return $this->$name;
	}
	function __set($name, $value) {
		$this->$name = $value;
	}
}
class B {
	private $t;
	function __get($name){
		return $this->$name;
	}
	function __set($name, $value) {
		$this->$name = $value;
	}
}
$a = new A;
$b = new B;
$a->p = $b;
$b->t = "foo";

echo $a->p->t;
$a->p->t = "bar";
echo $a->p->t;

Expected result:
----------------
foobar

Actual result:
--------------
foo
Fatal error: Cannot access private property A::$p in...

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2005-10-19 00:43 UTC] iliaa@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

$a->p = $b; is the problem line, you are trying to access a private property from outside the object, this is disallowed.
 [2005-10-19 12:53 UTC] kai at meder dot info
do you even read the bug-reports ?
by trying to set a private-property __get/__set are triggered in php5.1 (yes, it already works!) but there is a serious problem if using __get AND __set together in a chain!
 [2005-10-19 15:47 UTC] iliaa@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

Do you even read documentation? Getters and Setters can only be used to access properties that are not declared in the class.
 [2005-10-19 20:30 UTC] kai at meder dot info
in php5.1 all betas and RC1 __get and __set are ALSO called when trying to access protected/private (invisible) properties.

btw, the manual describes php5, not php5.1 which is in beta/rc-stadium ...

so please forward this *bug* to the overload-developers!
 [2005-10-19 20:52 UTC] tony2001@php.net
You were talking to one of the core developers, so I don't see a reason why you need another one to repeat the same.

 [2005-10-19 21:51 UTC] johannes@php.net
Ilia, Tony,    
    
you're right with php5.0 but this has somewhen changed 
with php 5.1.    
    
Taking this short example:    
    
<?php    
class A {    
    private $p;    
    function __set($name, $value) {    
        echo "in __set()\n";    
        $this->$name = $value;    
    }    
}    
    
$a = new A();    
$a->p = true;    
var_dump($a);    
?>    
    
With PHP 5.0 this gives:     
  Fatal error: Cannot access private property A::$p"    
    
With PHP 5.1 this gives    
  in __set()    
  object(A)#1 (1) {    
    ["p:private"]=>    
    bool(true)    
  }    
    
Same goes for __get and __call and private/protected    
properties.    
    
The only problem /seems/ to be the combination of __get  
and __set as in the  $a->p->t = "bar"; line of the  
original code.  
  
So something is broken - either it should work always or  
never.  
 [2005-10-20 11:48 UTC] dmitry@php.net
Fixed in CVS HEAD and PHP_5_1
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Sat Feb 01 15:01:31 2025 UTC