开发者

need help understanding aspects of php objects

开发者 https://www.devze.com 2023-03-07 05:25 出处:网络
i am new to php and is in need of some help to understand th开发者_JAVA百科e aspects of php objects which i do not get. In class a i have made class b and c which extends a, but what i want to do is a

i am new to php and is in need of some help to understand th开发者_JAVA百科e aspects of php objects which i do not get. In class a i have made class b and c which extends a, but what i want to do is acess the public letters variable in class a from class c so in can get ot the function testb() from class c.

Any help is much appreciated guys

   <?php

    class a {
        public $letters;
        function __construct() {
            $this->letters->b = new b();
            $this->letters->c = new c();
        }
    }   

    class b extends a {
        function __construct() {
            echo "hello world from b ";
        }

        private function testb() {
            echo "testing from b";
        }
    }

    class c extends a {
        function __construct() {
            echo "hello world from c ";
            $this->letters->b->testb();
        }
    }


    $a = new a();

?>

the following script echos our "hello world from b" and "hello world from c" but it does not print out "testing from b"...


A gotcha of PHP Objects is that Inheritance is fudged (just a bit).. The constructor of a parent object is not implicitly called when you instantiate one of it's child objects. Instead you must explicitly call the Parent Object's constructor.

class b extends a {
...
    public __construct() {
        parent::__construct();
        echo("Hello From B!");
    }
...
}

In your Class c constructor, $this->letters is not an object and has not been initialized since the a constructor has not been called.

If you're just playing around with objects, then ignore this part, but you're close to getting a circular hierarchy. If you add the changes that I suggested, I believe your code will explode if you try to instantiate either a B or a C object directly.


The reason you can't call testb from within the class c is that the method signature of testb declares it as private - meaning it can only be accessed within b instances. Change the visibility to default (no modifier) or public.

E.g.:

function testb() {
    echo "testing from b";
}

Or:

public function testb() {
    echo "testing from b";
}

Edit:

The problem is that you haven't called the super constructor from the constructor of c - the value of $this->b is therefore not initialised. Change the constructor of c to:

function __construct() {
    parent::__construct();
    echo "hello world from c ";
    $this->letters->b->testb();
}

Unfortunately, though, this will create an infinite loop where the constructor of a is instantiating c and the constructor of c is calling up to the constructor of a. Why do your letter classes even extend one another?

You also need to change the visibility of testb within the b class.


Ok, if you extend class c from b you can call the method otherwise not as you are extending it from class a not from c..


In your class a you are constructing a new object of class c.

This new object has no property $this->letters->b, it just has an uninitialized property $this->letters.

Note that the new object inherits the property $letters from the class it extends, but it does not inherit any values of an instantiated a object. So there is no $this->letters->b and no function $this->letters->b->testb() to call.


"c" extends "a" and doesn't inherit "b"s method

your example will return

Fatal error: Call to a member function testb() on a non-object

for

$this->letters->b->testb();

0

精彩评论

暂无评论...
验证码 换一张
取 消