0

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.

6
  • 5
    Why do you put untested code in production?! Commented Sep 24, 2012 at 11:24
  • @ThiefMaster Its called Agile development. Commented Sep 24, 2012 at 11:28
  • its on my private dev server, on top of it im only developer;) anyway, thanks for care:) Commented Sep 24, 2012 at 11:29
  • Oh, and if your website "silently died" you should configure your dev server's PHP to display_errors=on and error_reporting=E_ALL via php.ini Commented Sep 24, 2012 at 11:34
  • i have it, i checked logs (it goes to separate log which i tail -f in ssh session as well, and nothing>,<), thats like first time i saw something like this - thats why i asked question:) Commented Sep 24, 2012 at 11:37

2 Answers 2

3
$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.

Sign up to request clarification or add additional context in comments.

2 Comments

okie, then if its valid - why script stopped there and didnt continue to other parts, like it would do die();
Because in your case $this->$this does not result in anything useful and thus trying to access a property on this non-object will crash your script.
1

Its because you are technically doing

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

Which is valid.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.