Krzysztof
Krzysztof

Reputation: 319

Why neither netbeans nor PHP reports error from this code

Why do neither netbeans nor PHP report an error from this code:

public function __construct ()
{
global $blog;
$this->_blog_id = $blog->blog_id;
$this->_post_amount = $blog->
$this->_limit_per_page = $blog->config_get('posts_limit_per_page');
$this->_short_sign_limit = $blog->config_get('posts_short_sign_limit');
}

I had a phone call and forgot about that unfinished 3rd line, saved my work and website silently died on it.

Upvotes: 0

Views: 80

Answers (2)

ThiefMaster
ThiefMaster

Reputation: 318468

$this->_post_amount = $blog->
$this->_limit_per_page = $blog->config_get('posts_limit_per_page');

can also be written as

$this->_post_amount = $blog->$this->_limit_per_page = $blog->config_get('posts_limit_per_page');

which makes no sense but is perfectly valid.

However, in your case it breaks your script because using $instance->$other_instance without a __toString method results in this error: Object of class Test could not be converted to string. You IDE does not check for this since since it's really an edge case and as soon as it's not $this->$this but e.g. $this->$that with $that being e.g. the return value of another function it would be near impossible to know what $that can be.


Here's some example code that proves how $this->$this can actually work fine:

<?php
class Foo {
    public $foo = 'bar';
}

class Test {
    private $xyz;
    function __construct() {
        $this->xyz = new Foo();
    }
    function __toString() {
        return 'xyz';
    }
    function run() {
        echo $this->$this->foo;
    }
}

$t = new Test();
$t->run();

The $this->$this statement will result in __toString being used for the second $this and thus it will be equivalent to $this->xyz so the whole line will end up as echo $this->xyz->foo; which is valid.

Upvotes: 3

Petah
Petah

Reputation: 46040

Its because you are technically doing

$this->_post_amount = $blog->{$this->_limit_per_page} = $blog->config_get('posts_limit_per_page');

Which is valid.

Upvotes: 1

Related Questions