php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #13842 Member variables in parent and child classes overwrite each other
Submitted: 2001-10-26 17:52 UTC Modified: 2001-10-28 10:52 UTC
From: dfplant at hotmail dot com Assigned:
Status: Not a bug Package: Class/Object related
PHP Version: 4.0.6 OS: Windows NT 5.0 build 2195
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: dfplant at hotmail dot com
New email:
PHP Version: OS:

 

 [2001-10-26 17:52 UTC] dfplant at hotmail dot com
I'm not all that familiar with PHP, so it's possible I haven't understood something that should be obvious, or have mistyped something. But assuming that's not the case:

To my eye this makes using someone else's classes via inheritence a wee bit dangerous, and makes using inheritence at all somewhat problematic since changing a class that exists in an inheritence makes one liable to create subtle bugs in code that one has not modified - which defeats one of the (possibly the most) principal purposes of OO.

If I could make a suggestion: support of 'private' and 'public' for member variables might be a good thing. Especially if access defaulted to 'private' and that meant that the variable was only visible to the immediate class.

Using the CGI binary without modification running on "Microsoft-IIS/5.0" I used the following test script:

<html>
<head>
<title>Inheritence Bug</title>
</head>
<body>

<?php
	//=========================================================================
	// NOTE:
	// Bad behaviour if C2 extends C1, Correct if C2 extends C1_1
	class C2 extends C1_1
	{
		var $m_sMe = "C2";					// ERROR: this overwrites parent
		var $m_sIniter = "";

		function C2( $sIniter="")
		{
			$this->m_sIniter = $sIniter;	// OK - by defn
			parent::C1( $this->m_sMe);		// OK - the way to do it
		}

		function WhoIsIt()
		{
			printf( "C2::WhoIsIt() : This is: " . $this->m_sMe . "<br>\n");
			printf( "Inited by: " . $this->m_sIniter . "<br>\n");

			parent::WhoIsIt();
		}
	}

	//=========================================================================
	class C1_1
	{
		var $m_sMe_1 = "C1";
		var $m_sIniter_1 = "";

		function C1( $sIniter="")
		{
			print( "(OK)<br>\n");
			$this->m_sIniter_1 = $sIniter;
		}

		function WhoIsIt()
		{
			printf( "C1::WhoIsIt() : This is: " . $this->m_sMe_1 . "<br>\n");
			printf( "Inited by: " . $this->m_sIniter_1 . "<br>\n");
		}

		function ResetBase()
		{
			$this->m_sMe_1 = "C1";

			printf( "C1::ResetBase() : This is: " . $this->m_sMe_1 . "<br>\n");
			printf( "Inited by: " . $this->m_sIniter_1 . "<br>\n");
		}
	}

	//=========================================================================
	class C1
	{
		var $m_sMe = "C1";
		var $m_sIniter = "";

		function C1( $sIniter="")
		{
			print( "(Bad)<br>\n");
			$this->m_sIniter = $sIniter;	// ERROR: this overwrites child's value
		}

		function WhoIsIt()
		{
			printf( "C1::WhoIsIt() : This is: " . $this->m_sMe . "<br>\n");
			printf( "Inited by: " . $this->m_sIniter . "<br>\n");
		}

		function ResetBase()
		{
			$this->m_sMe = "C1";

			printf( "C1::ResetBase() : This is: " . $this->m_sMe . "<br>\n");
			printf( "Inited by: " . $this->m_sIniter . "<br>\n");
		}
	}

	//=========================================================================
	$test = new C2( "Doug");
	$test->WhoIsIt();
	//$test->ResetBase();
?>

<p>
In case there is a platform dependency, this is what I consider correct output:<br>
<pre>
C2::WhoIsIt() : This is: C2
Inited by: Doug
C1::WhoIsIt() : This is: C1
Inited by: C2
</pre>
</p>

</body>
</html>

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-10-27 01:37 UTC] sniper@php.net
Works fine for me with latest CVS. Please try the 
development build from http://www.php4win.com/

--Jani


 [2001-10-28 10:52 UTC] jeroen@php.net
Alle class vars are public, in a future PHP (5?) there will also be private object vars.

Until then, object vars of children and parents are simply the same, and thus overwrite eachother. This is intended behavior.

Not a bug.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Mon Dec 30 14:01:28 2024 UTC