关于_set()的有关问题

php中文网
发布: 2016-06-13 13:05:29
原创
926人浏览过

关于__set()的问题





PHP code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php

namespace longli;

class Employee  {
    private $name;
    public function __set($xproName, $value) {
        echo '<p>employee::__set is called $proname=='.$xproname.', $value=='.$value.'</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/xiazai/code/11217">
                            <img src="https://img.php.cn/upload/webcode/000/000/013/176534460840981.gif" alt="QICMS商家联盟网站系统">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/xiazai/code/11217">QICMS商家联盟网站系统</a>
                            <p>2009年10月28日1、QICMS商家联盟网站系统v2.0正式上线2、修正IE6.0下商家展示页及后台商家编辑等页面错位问题3、修正商家联盟/打折商家分页问题4、修改网站首页右侧的 &#39;最新加盟商家&#39; 为 &#39;今日加盟商家&#39;5、修改网站首页右侧的 &#39;热门关注商家&#39; 为 &#39;今日打折卡申请&a</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="QICMS商家联盟网站系统">
                                <span>0</span>
                            </div>
                        </div>
                        <a href="/xiazai/code/11217" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="QICMS商家联盟网站系统">
                        </a>
                    </div>
                ';
        $this->xproName = $value;
    }
}
class CEO extends Employee {
    function __construct($name="") {
        echo '<h2>CEO::__construct begin!</h2>';
        $this->name = $name;
        echo '<h2>CEO::__construct end!</h2>';
    }
         
}

$boss = new CEO("Blus");
?>

登录后复制




上面的代码,__set()被莫名其妙执行了两次,请问这是为什么呢? 输出结果为:

CEO::__construct begin!

Employee::__set is called $proName==name, $value==Blus

Employee::__set is called $proName==xproName, $value==Blus

CEO::__construct end!








------解决方案--------------------
__set( $property, $value ) : 给一个未定义的属性赋值时调用 
你赋值了两次当然就执行两次了。
------解决方案--------------------
第一次给未定义的类成员$name赋值: $this->name = $name; 调用一次
在调用重载方法__set的时候,第二次给未定义的类成员 $xproName赋值: $this->xproName = $value; 调用一次。
我想你的本意是这样: 
PHP code
public function __set($xproName, $value) {
        echo '<p>employee::__set is called $proname=='.$xproname.', $value=='.$value.'</p>';
        // 这个 $xproName是一个变量,内容是变量名。 详见手册中 可变变量
        $this->$xproName = $value;
    }
<br><font color="#e78608">------解决方案--------------------</font><br>预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”<br><br><br>//__get()方法用来获取私有属性<br>private function __get($property_name)<br>{<br>if(isset($this->$property_name))<br>{<br>return($this->$property_name);<br>}else<br>{<br>return(NULL);<br>}<br>}<br>//__set()方法用来设置私有属性<br>private function__set($property_name,$value)<br>{<br>$this->$property_name=$value;<br>}
<br><font color="#e78608">------解决方案--------------------</font><br>你仍然没弄清楚__set()的作用,当你为类成员属性$xproName赋值后,它已经不再是未定义了。所以不具备死循环的条件。<br>我觉得用__set()来实现的封装是过分的封装,为什么要在类外部修改一个隐藏的属性?为什么不设为公有?<br><br>至于说 事实上,为了“添加一个隐藏属性”<br>添加一个隐藏的属性?你的程序需要的属性名难道不是固定的吗?你应该先声明该隐藏属性。<br><br><font color="#e78608">------解决方案--------------------</font><br>所用面向对象的语言中都对对象的每个属性设有 Access 和  Assign 方法,以便开发者灵活的控制对象的行为。由于 php 不是面向对象的语言,所以虽然粗糙的提供了 __get 和 __set 方法,但与 Access 和  Assign 相比还是有很大差距的<br>与 Access 和  Assign 一样,如果仅仅将 __get 和 __set 作用于对象属性的存取,就大有画蛇添足的嫌疑<br>  __get 和 __set 在对象中的作用是在存取属性的同时隐式的之行一些方法,而无需显式的调用方法<br><div class="clear"></div>
登录后复制
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号