Is declaring fields on classes actually harmful in PHP?
<p>Consider the following code, in which the setter is deliberately broken due to a mundane programming error that I have made for real a few times in the past:</p>

<pre><code>&lt;?php

    class TestClass {

        private $testField;

        function setField($newVal) {
            $testField = $newVal;
            // deliberately broken; should be `$this-&gt;testField = $newVal`
        }

        function getField() {
            return $this-&gt;testField;
        }

    }

    $testInstance = new TestClass();
    $testInstance-&gt;setField("Hello world!");

    // Actually prints nothing; getField() returns null
    echo $testInstance-&gt;getField(); 

?&gt;
</code></pre>

<p>The fact that I declared <code>$testField</code> at the top of the class helps conceal that programming error from me. If I hadn't declared the field, then I would get something similar to the following warning printed to my error log upon calling this script, which would potentially be valuable to helping my debugging  - especially if I were to make an error like this in a large and complicated real-world application:</p>

<blockquote>
  <p>PHP Notice:  Undefined property: TestClass::$testField in /var/www/test.php on line 13</p>
</blockquote>

<p>With the declaration, there is no warning.</p>

<p>Perhaps I'm missing something, but I'm aware of only two reasons to declare class fields in PHP: firstly, that the declarations act as documentation, and secondly, that without declarations one can't use the <code>private</code> and <code>protected</code> access modifiers, which are arguably useful. Since the latter argument doesn't apply to public fields - assigning to an undeclared field of an object makes it public - it seems to me that I ought to at least comment out all my public field declarations. The comments will provide the exact same documentation value, but I will benefit from warnings if I try to read an uninitialized field.</p>

<p>On further thought, though, it doesn't seem to make sense to stop there. Since in my experience trying to read an uninitialized field is a much more common cause of error than trying to inappropriately read or modify a private or protected field (I've done the former several times already in my short programming career, but never the latter), it looks to me like commenting out all field declarations - not just public ones - would be best practice.</p>

<p>What makes me hesitate is that I've never seen anybody else do it in their code. Why not? Is there a benefit to declaring class fields that I'm not aware of? Or can I modify PHP's configuration in some way to change the behavior of field declarations so that I can use real field declarations and still benefit from "Undefined property" warnings? Or is there anything else at all that I've missed in my analysis?</p>
