php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #39713 Static variables defined in static methods duplicated in derived classes
Submitted: 2006-12-02 04:24 UTC Modified: 2006-12-03 00:47 UTC
From: paul at digitalbacon dot us Assigned:
Status: Not a bug Package: Scripting Engine problem
PHP Version: 5.2.0 OS: Linux, Mac OS X 10.4, Windows XP
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: paul at digitalbacon dot us
New email:
PHP Version: OS:

 

 [2006-12-02 04:24 UTC] paul at digitalbacon dot us
Description:
------------
When using a static variable defined inside a parent class's 
static method block, different outcomes can occur depending on  
the scope name used when calling.

The effect is that a non-overridden method in the child class 
is allocated a completely separate static variable... not how 
it works in C or C++, which I know PHP is not.

I encountered this problem implementing a singleton pattern in 
a parent class. I apologize for the reproduction code, but it 
does illustrate my perceived problem.

The closest bugs I found, relate to static class attributes, 
not regular static variables.

Reproduce code:
---------------
<?php

class TheParent {
        public static function staticMethod()
        {
                static $theStaticValue = true;

                if ($theStaticValue == true) {
                        $theStaticValue = false;
                        return true;
                } else return $theStaticValue; // false
       }
}

class TheChild extends TheParent {}

$a1 = TheParent::staticMethod();
$a2 = TheParent::staticMethod();
$b1 = TheChild::staticMethod();
$b2 = TheChild::staticMethod();

echo '$a1: ', $a1, "\n"; // true
echo '$a2: ', $a2, "\n"; // false
echo '$b1: ', $b1, "\n"; // true (I believe this should be false)
echo '$b2: ', $b2, "\n"; // false
?>

Expected result:
----------------
My intuition tells me that the parent's static variable should 
be used regardless of the scope name used... unless it's 
actually redefined in the child class.

In this example, I expect the output to be:

$a1: 1
$a2: 
$b1: 
$b2: 

Is local static method data not shared?

Actual result:
--------------
$a1: 1
$a2: 
$b1: 1
$b2: 

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-12-02 11:49 UTC] tony2001@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


 [2006-12-03 00:47 UTC] paul at digitalbacon dot us
From the manual:

...A static variable exists only in a local function scope, 
but it does not lose its value when program execution leaves 
this scope.

I don't see why the use of the scope resolution operator 
(::) should change a static method's local function scope. 
Can a single static method really have multiple local scopes 
if using inheritance?
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Thu Mar 13 21:01:32 2025 UTC