PSR 2 Coding Standard

I was checking out PSR-2 to make sure my coding style was correct, especially since I saw in the news release that Yii 2 follows this convention. I was really surprised to see in paragraph 4.2 that:

[color=#333333]Property names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.[/color]

Obviously, this is not strictly observed in Yii 2 because I’ve seen instances of it :

Example from Advanced Template LoginForm.php model:

class LoginForm extends Model


    public $username;

    public $password;

    public $rememberMe = true;

    private $_user = false;

And also, I have no clue why they would be against coding this way, it seems very intuitive to indicate private or protected by using an underscore. I want to do my best to write code according to the standard, I’m a big believer in having a standard, but there is no explanation to this. I did a quick Google search and found nothing.

I’m leaning towards ignoring the standard on this issue because using the underscore just seems right and I want to follow the coding style of Yii 2. But on the other hand ignoring standards can be dangerous and lead to bad habits. I know this is an incredibly microscopic issue, but anyone have any thoughts on why they would be against the underscore for private properties?

An argument in favour of the PSR-2 standard: if you change the status of a property from protected to public, you have to refactor all references to it.

The underscore in the name reminds me of to the old programmer’s habit of prefixing a variable’s type in its name (e.g. “floatAmount” and “strCustomerName”), which was popular in older languages when IDE’s were nonexistent. But now these habits are considered a bad practice by authorities such as Robert C Martin (see book “Clean Code”).

Because of this, I would say that your IDE should notify you about a variable being protected, instead of a naming convention that will probably be violated by many people. So I would vote in favour of conforming the Yii2 codebase to the PSR-2 way.

Thank you, I really appreciate your answer, it was very thorough and makes a lot of sense, especially on the refactor issue. I just read Clean Code, it’s a good read. On the other hand, the underscore is very effective in what it communicates. It will be ineresting to see what the Yii 2 team does in the future. I have to think about what this means for me personally. Thanks again for a great answer.


We are fully aware of the consequences but we still think that it is a good thing ;)

Care to justify that assertion?

which assertation?

Assertion, not assertation. Probably a poor choice of words regardless. From your quote:

What are your valid reasons for prepending class variables with underscores? I also dislike seeing it, and I tend to think it reflects poor design choices when you need to prepend public member variables with underscores to imply they shouldn’t be accessed directly.

We’re never prepenging public or protected variables. Actaully I’m OK with both changing it to no underscore or leaving it as is.