时间:2014-01-29 来源:

PHP4之真OO


PHP4之真OO

文的作者Johan Persson是PHP中著名的JpGraph图表类库的开发者. 本文是作者对于在PHP4中进行面向对象开发时需要注意的几个小问题的总结.
翻译: Binzy Wu [Mail: Binzy at JustDN dot COM], 水平有限,div+css+js切图 欢迎探讨. 2004-2-4

简介
本文的对象是那些曾使用更加成熟的OO [1] 语言页面div重构, Java, 进行开发的朋友(如我自己). 在使用PHP4进行完全的OO开发时有着许多的语义[3] (semantic)
上的陷阱[4].

希本文内容可助人避我曾犯之错.

引用 VS 拷贝语义
这基本上是错误的主要来源(至少对于我来说).即使在PHP的文档中你可以读到PHP4较之引用更多使用拷贝语义(如其他我所知的面向对象语言), 但这仍将使你最后在一些细小之处困扰.

接下来的两部分用于阐述二个小的例子,web外包 在这二个例子中拷贝语义也许会令你惊讶.

要时刻牢记重要的是一个类的变量不是一个指向类的指针而是实际的类自己本身[5]. 大多数问题引发自对于赋值操作符(=)的误解网页切图制作, 即以为是给一个对象一个别名,div页面 而实际上却是一个新的拷贝. 例如假设$myObj是某个类的实例div+css+js切图, 并且它有一个Set()方法. 那么下面的代码也许不会像一个C++(或者Java)程序员所期望的那样工作.

function SomeFunction($aObj) { $aObj->Set(10); }

SomeFunction ($myObj);



那么现在,div+css+js切图 很容易便会认为该函数所调用的Set()方法会作用于$myObj. 但这是错的!

其实发生的是$myObj被拷贝为一个新的承接网站前端, 与原对象一样的拷贝----参数$aObj. 然后当Set()方法被调用时,承接网站前端 它仅仅作用于本地拷贝而非原参数----$myObj.

在包含直接或间接(如上)赋值操作的地方就会发生各种各样的上述问题.

为了函数能像你所期望的那样行动(也许是), 那么你不得不通过修改方法申明来告诉PHP使用引用来传递对象,承接网页制作 如:
Function SomeFunction(&$aObj)


如果你再一次尝试上面的代码web外包, 那么你会发现Set()方法将作用于原来的参数上,web外包 因为现在我们在作用中创建了一个$myObj的别名----$aObj.

但是你不得不小心网页切图制作, 因为即使是&操作符也不是在任何时候都能救你,网页切图制作 如下面的举例.

从一个引用来获得引用

假设有如下代码:
$myObject = new SomeClass();$myRefToObject = &$myObject;


如果我们现在想要一个引用的拷贝(因某些理由), 那么我们要做什么呢? 你可能会由于$myRefToObject已经是引用而试图那么写:
$myCopyRefToObject = $myRefToObject;

正确么? 不! PHP会创建$myRefToObject所引用对象的新拷贝. 如果你想拷贝一个对象的引用,网页重构报价 你不得不这么写:
$myCopyRefToObject = &$myRefToObject;


在与前所述例子相当的C++的例子中承接网站前端, 便会创建一个引用的引用. 与其在PHP中不同. 这是一个经验丰富的C++程序员常会作的直觉假设相反的,承接网站前端 而这会是你的PHP程序中小BUG的来源.

请小心由此所产生的间接(传递参数)或直接的问题.

我个人所达成的结论psd切图html, 而且可以对像我这样的老狗而言使语义更加可预测.

在构造函数中对$this使用引用

在一个对象的构造函数里初始化作为其他对象发现者(Observer[6])的对象是一个常见的模式. 下面几行代码便是一个示例:
class Bettery
{
function Bettery() {…};
function AddObserver($method, &$method)
}
function Notify(){…}
}
class Display
{
function Display(&$batt)
{
$batt->AddObserver("BatteryNotify",$this);
}
function BatteryNotify() {…}
}


但是,网页切图制作 这并不会正常工作div+css+js切图, 如果你是这么实例化对象的:
$myBattery = new Battery();$myDisplay = new Display($myBattery);


这么做的错误在于new时在构造函数中使用$this并不会返回同一个对象. 反而会返回最近创建对象的一个拷贝. 即在调用AddObserver()时所传送的对象于原对象不是同一个. 然后当Battery类尝试通知所有它的观察者(Observer)(通过调用他们的Notify方法)时,div+css+js切图 它并不会调用我们所创建的Display类而是$this所代表的类(即我们所创建的Display类的拷贝). 因此如果Notify()方法更新了一些实例变量承接网站前端, 并不像我们所设想原Display类会被更新,页面div重构 因为更新的其实是个拷贝. 为了让它工作psd切图html, 你必须使构造函数返回同一个对象,手机div+css 正如与最初$this所象征的那样. 可以通过添加&符号于Display的构造web外包, 如$myDisplay = & new Display($myBattery);
一个直接的结果是任何Display类的Client必须了解Display的实现细节. 事实上,web外包 这会产生一个可能引起争论的问题: 所有对象的构建必须使用额外的&符号. 就我所说的基本上是安全的网页切图制作, 但忽略它可能会在某些时候得到不想要的如上述示例般的作用.

在JpGraph中使用了另一种方法来解决. 即需要使用通过添加一个能安全的使用&$this引用的”Init()”方法的所谓二阶段构造来”new”一个对象(仅仅是因为在构造函数中的$this引用返回对象的一个拷贝而不如所期望的那样执行). 因此上面的例子会如下实现:
$myBattery = new Battery();
$myDisplay = new Display();
$myDisplay->Init($myBattery);


如JPGraph.php中的”LinearScale”类.


使用foreach

另外一个相似代码却不同结果的问题是”foreach”结构的问题. 研究一下下面的二个循环结构的不同版本.
// Version 1
foreach( $this->plots as $p )
{
$p->Update();
}



// Version 2
for( $i=0; $i<count($this->plots); ++$i )
{
$this->plots[$i]->Update();
}


现在是一个价值10美元的问题[7]: version1==version2么?

令人惊讶的答案是:No! 这是细小却是关键的不同. 在Version 1中,div页面 Update()方法将作用于”plots[]”数组中对象的副本. 因此数组中原来的对象并不会被更新.

在Version 2中Update()方法将如预期的作用于”plots[]”数组中的对象.

正如第一部分所陈述的div+css+js切图, 面向对象.
[2]. 原文并无C#, 如有任何建议请和Binzy联系.
[4]. C++中有一本著名的”C++ Gotchas”.
[5]. 这里的类应该是指Instance, 即”Design Patterns”.
[7]. 有个挺有趣的关于交易的小故事:
有人用60美元买了一匹马web外包, 又以70美元的价钱卖了出去;然后,web外包 他又用80美元把它买回来网页切图制作, 最后以90美元的价钱卖出.在这桩马的交易中,网页切图制作 他? (A)赔了10美元; (B)收支平衡; ©赚了10美元;(D)赚了20美元; (E)赚了30美元.
这是美国密执安大学心理学家梅尔和伯克要大学生们计算的一个简单的算术题.结果只有不到40%的大学生能够作出正确答案div+css+js切图, 多数人认为只赚了10美元.其实,网页重构报价 问题的条件十分明确承接网站前端, 这是两次交易,承接网站前端 每次都赚10美元psd切图html, 而很多人却错误地认为当他用80美元买回来时己经亏损了10美元. 有趣的是,手机div+css 同一问题web外包, 以另一种方式提出来:有一个人用60美元买了一匹白马,div切图排版 又以70元的值卖出去;然后网页切图制作, 用80美元买了一匹黑马,网页切图制作 又以90美元的值卖出去.在这桩买卖马的交易中div+css+js切图, 他____(把同样的五个选择罗列出来).这时,div+css+js切图 另一组大学生在回答上述问题时承接网站前端, 结果大家都答对了.
点击次数:3813
作者:
web前端行业资讯
Web new NewsList
谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日苹果经典电脑Lisa源代码修复完成将于2018年开源 ,,2017年12月28日腾讯浏览指数发布年终榜单2017年人们都关注哪些AI话题? ,,2017年12月28日除了发现开普勒90,NASA还靠AI做了什么? ,,2017年12月28日柯洁宣布:明年4月,将再次与围棋AI交锋 ,,2017年12月28日百度无人车美国首秀CES将发布Apollo2.0 ,,2017年12月28日这四种技术发展趋势将在2018年改变世界 ,,2017年12月28日2017:谷歌DeepMind团队的年度回顾 ,,2017年12月28日封杀这个公式,AI智商将为零 ,,2017年12月28日微软AI高管:要让所有人、所有机构都用上人工智能 ,,2017年12月28日为什么Linux桌面年一直未到来 ,,2017年12月28日AppleLisa操作系统将开源 ,,2017年12月28日2018年9大技术趋势预测 ,,2017年12月28日谷歌研究院发布NIMA:能评价图像有多美,还能让图像变得更美 ,,2017年12月28日苹果为2019年iPhone开发大容量电池新技术 ,,2017年12月28日谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日NYOJ弟弟的作业2015年02月09日第二章吸引你的眼球—UI编程(3) 【编程语言】2014年12月30日FlattenBinaryTreetoLinkedList 【编程语言】2015年04月08日分布式网络爬虫Nutch中文教程nutcher(JAVA)2015年07月27日数据库case,when学习 【编程语言】2015年03月17日【OpenCV】复制、切割出图像ROI区域 【移动开发】2015年04月17日不用javascript实现带序号的表格隔行换色的效果2014年01月29日Unity5.1新的网络引擎UNET(一)概括1 【编程语言】2015年07月13日PHP配置心得包含MYSQL5乱码解决2014年01月29日Oracle11g服务器与客户端卸载、安装全过程2014年01月30日C++操作MySQL例子(1)2016年11月08日openSUSE国内镜像汇总 【移动开发】2015年04月07日HTTP中header的信息讲解以及设置【综合】2015年08月05日子窗体与父窗体传值示例js代码2014年01月29日Java多线程学习中遇到的一个有趣的问题 【综合】2014年11月04日浏览器主页不再害怕被修改2014年01月29日MozillaFirefox6.0Beta5发布 ,,2016年06月29日hdu1074---DoingHomework 【数据库】2015年02月13日PHP怎样调用MSSQL的存储过程2014年01月29日ZooKeeper分布式集群部署及问题 【编程语言】2015年07月29日中国要害部门将弃用操作系统等美IT产品,引起美国愤怒【架构设计】2015年02月11日夫妻的对话 【编程语言】2014年11月10日网页设计参考:极简主义和网格设计2014年01月28日CentOS服务器Mysql主从复制集群的搭建 【编程语言】2015年03月16日cocos2d-x3.6连连看自动消除 【Web前端】2015年06月30日11g新特性之activedatabaesduplicate【云计算】2015年05月29日使用jQuery.fn自定义jQuery翻页插件2014年01月29日文件夹看门狗v2.5免注册美化绿色版下载2014年01月29日DedeCms5.7实现代码高亮的方法2014年01月28日虚拟主机重启代码2014年01月29日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)