时间:2021-07-01 10:21:17 帮助过:28人阅读
- <br><!--? <BR-->class employee{ <br>private $sal=3000; <br>//protected $sal=3000; <br>public function getSal(){ <br>return $this->sal; <br>} <br>} <br>class Manager extends employee { <br>protected $sal=5000; <br><br>public function getParentSal(){ <br>//这里返回的是父类的private属性. <br>return parent::getSal(); <br>} <br>} <br>$manager = new Manager(); <br>echo "PHP ".phpversion()."<br>"; <br>echo $manager->getSal(); <br>echo "<br>"; <br>echo "parent's \$sal ".$manager->getParentSal(); <br>?> <br> <br>程序运行结果: <br><span style="CURSOR: pointer" onclick="doCopy('code34529')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>PHP 5.3.8 <br>3000 <br>parent's $sal 3000 <br> <br>如果父类中的属性被子类重写了。结果是这样的。注意 第5行的属性定义变成了protected。 <br><span style="CURSOR: pointer" onclick="doCopy('code12503')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--? <BR-->class employee{ <br>//private $sal=3000; <br>protected $sal=3000; <br>public function getSal(){ <br>return $this->sal; <br>} <br>} <br><br>class Manager extends employee { <br>protected $sal=5000; <br><br>public function getParentSal(){ <br>//这里返回的是父类的private属性. <br>return parent::getSal(); <br>} <br>} <br>$manager = new Manager(); <br>echo "PHP ".phpversion()."<br>"; <br>echo $manager->getSal(); <br>echo "<br>"; <br>echo "parent's \$sal ".$manager->getParentSal(); <br><br>?> <br> <br>程序运行结果: <br><span style="CURSOR: pointer" onclick="doCopy('code52024')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>PHP 5.3.8 <br>5000 <br>parent's $sal 5000 <br> <br>第一个列子中 父类的private $sal没有被重写 所以$manager->getSal()这个父类的方法 调用的是父类自己的私有属性$sal 此时内存中有两个$sal <br>第二个列子中 父类的protected $sal被重写 $manager->getSal()这个父类的方法 调用已经被重写的$sal 父类的$sal在内存中是不存在的 此时内存中只有一个$sal <br>接下来看第三个列子 <br>子类中重写的方法对当前private有效。 <br><span style="CURSOR: pointer" onclick="doCopy('code33461')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--? <BR-->class employee{ <br>private $sal=3000; <br>public function getSal(){ <br>return $this->sal; <br>} <br>} <br><br>class Manager extends employee { <br>private $sal=5000; <br>//重写过的方法 <br>public function getSal(){ <br>return $this->sal; <br>} <br>public function getParentSal(){ <br>//这里返回的是父类的private属性. <br>return parent::getSal(); <br>} <br>} <br>$manager = new Manager(); <br>echo "PHP ".phpversion()."<br>"; <br>echo $manager->getSal(); <br>echo "<br>"; <br>echo "parent's \$sal ".$manager->getParentSal(); <br>?> <br> <br>运行结果 <br><span style="CURSOR: pointer" onclick="doCopy('code15707')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>PHP 5.3.8 <br>5000 <br>parent's $sal 3000 <br> <br>这个列子中子类重写getSal()方法 所以他调用的是子类的属性 <br>如果你注释子类的这一行 <br>//private $sal=5000; <br>你会发现一个错误:Notice: Undefined property: Manager::$sal in E:\wamp\www\oo\2-5\2-5-3.php on line 14 <br>如果注释掉12行的子类重写方法 那么echo $manager->getSal();得到的结果是 父类的私有属性$sal 3000 <br><br>打开zend调试状态看看,内存中的情况。注意最下面,有两个$sal 。分别是 3000 和 5000 。 <br><span style="CURSOR: pointer" onclick="doCopy('code42411')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--? <BR-->class employee{ <br>private $sal=3000; <br>public function getSal(){ <br>return $this->sal; <br>} <br>} <br>class Manager extends employee { <br>protected $sal=5000; <br>public function getParentSal(){ <br>return $this->sal; <br>} <br>} <br>$manager = new Manager(); <br>echo "PHP ".phpversion()."<br>"; <br>echo $manager->getSal(); <br>?> <br> <br>程序运行结果: <br><span style="CURSOR: pointer" onclick="doCopy('code62301')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>PHP 5.3.8 <br>3000 <br> <br>将父类的属性$sal 改成 protected ,子类重写了父类的属性。在内存中只有一个 $sal 。 <br><span style="CURSOR: pointer" onclick="doCopy('code29189')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--? <BR-->class employee{ <br>protected $sal=3000; <br>public function getSal(){ <br>return $this->sal; <br>} <br>} <br>class Manager extends employee { <br>protected $sal=5000; <br>public function getParentSal(){ <br>return $this->sal; <br>} <br>} <br>$manager = new Manager(); <br>echo "PHP ".phpversion()."<br>"; <br>echo $manager->getSal(); <br><br>?> <br> <br>程序运行结果: <br><span style="CURSOR: pointer" onclick="doCopy('code28525')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>PHP 5.3.8 <br>5000 <br> <br>如果你学过java,你会觉得这一切都是很难理解的。 <br>在Java中当子类被创建时,父类的属性和方法在内存中都被创建,甚至构造函数也要被调用。 <br>PHP5不是这样,PHP5调用父类用的是parent:: 而不是 parent-> ,这足以说明PHP5不想在内存中让父类也被创建。PHP5想让继承变的比Java更简单。 <br>适应下就好。</li><li><p></p></li><li><p align="left"><span id="url" itemprop="url">http://www.bkjia.com/PHPjc/326161.html</span><span id="indexUrl" itemprop="indexUrl">www.bkjia.com</span><span id="isOriginal" itemprop="isOriginal">true</span><span id="isBasedOnUrl" itemprop="isBasedOnUrl">http://www.bkjia.com/PHPjc/326161.html</span><span id="genre" itemprop="genre">TechArticle</span><span id="description" itemprop="description">请仔细看这句话 如果父类有私有的属性。那么父类的方法只为父类的私有属性服务。 下面通过一系列列子来加深理解. 这个例子看起来很奇...</span></p></li><li> </li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre>