PHP allows access to non-static methods using ClassName:: But Why does it throw error when accessing non-static properties using ClassName::?

Class Names can access non-static methods but cannot access non-static properties

Code

<?php

class BaseClass {
    public $x = 10;
    public function __construct() {
        echo "BaseClass constructor". "<br>";
    }
}

class SubClass extends BaseClass {
    public function __construct() {
        BaseClass::__construct();
        echo "SubClass constructor" . "<br>";
        print parent::$x;
    }
}

(new SubClass());

?>

Run Code to see Result on your Browser

Comments (11)

Joe Clark's photo

From what I've read, PHP 4 didn't have the static keyword in function declarations, but still allowed you to call a method using the :: static operator. It was kept for backward compatibility reasons in PHP 5 and up and in PHP 7+ is deprecated. I started with PHP 5.4, so never encountered this quirk. To me, it seems like a bug. But it is indeed a "feature".

Mohammad Daud Ibrahim's photo

The Measure of a Man is What He Does with Power.

AARGH! as a Novice I find this very confusing. I guess I've to stop tiring myself over this and consider it as " This is how it works in PHP ".
Your answer sounds logical, helpful indeed Thanks!

Jason Knight's photo

Statics are STATIC, they exist all the time. NON-STATIC means they only exist after you "new' and assign said resultant object to a variable, and will only exist on that variable. They never actually exist in memory on the class.

That's kind of the POINT of static and non-static... so if you're asking this you kind-of missed the point.

Show all replies
Mohammad Daud Ibrahim's photo

The Measure of a Man is What He Does with Power.

I think out of all the answers here yours make most sense to me. I think I now understand the why behind it. Thank you very much. 😊

Mark's photo

It does not make sense to access non-static things by class name, unless you also provide an instance somehow.

Non-static things exist individually for each object. E.g. MY car is red, not ALL cars, not just ANY car, but mine.

If you only use Car (the type) without any reference to the specific car, you have not unambiguously specified what you actually want.

For your case, I am not quite sure I understand, and I've not done PHP for years, but maybe the answer is that constructors are always static.

Which makes sense, since you're making a specific object. If it weren't static, you would need an object to create itself.

Show all replies
Mark's photo

formerly known as M

That's ok, hope the other answers explain the missing details