`
only_java
  • 浏览: 113449 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

搞不懂php中的面向对象

    博客分类:
  • php
阅读更多

 php5的面向对象虽然加强了很多,但还有很多东西比起java的面向对象弱了很多。有些东西甚至让人费解,就比如下面的代码,b extends a ,实例化b时a的构造函数却没执行?不知道实例化b时,php到底是则么执行的,高手来帮忙解惑!还有php的static成员竟然能在非static方法中使用,还好反过来会报错。好了,先贴代码

 

 class a {

	function __construct() {
		echo "a";
	}
}
class b extends  a{
	function __construct(){
	 
		echo "b";
	}
	
    private $x=100;
   public  static  function getx(){
   	  
   	  return $this->x; 
   }
}
$x=new b();
echo $x->getx();

  结果是:

     b100

 “a”竟然没有输出,真不知到php里类初始化的顺序

补充:

  刚刚发现,原来是b的构造函数覆盖了a的构造函数,把b的构造函数去掉,就能输出a。真奇怪构造函数也能被覆盖?

分享到:
评论
43 楼 Xorcerer 2009-06-24  
xieye 写道
Xorcerer 写道
kingheaven 写道
xieye 写道
luolonghao 写道

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
            echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html> 



实际项目的页面怎么可能这么简单呢。。

所以,模板是肯定用到的。


PHP本身就是模板语言啊~所以不需要再使用任何模板了~把值传到PHP页面,直接拿PHP来处理输出就可以了。

我也是这样想的,看看Wordpress的模板的用法,就是如此,很简洁。


关于那个用class来当静态函数的容器,其实直接把函数写进同一个文件里就好了,完全不需要拿个class来包装。



类就相当于命令空间,这样可以有重名的函数。当然更好。不然得有多少下划线在函数名中。

文件本身也有类似命名空间的作用了。
42 楼 dualface 2009-06-24  
PHP 没有线程这个概念。不要拿其他语言来套 php。

而且 static 函数里写 $this 本来就是错误的。php 开了 strict 就会有警告。但仍然允许执行是为了和 php4 的程序兼容。

强烈建议搞懂 php 的基础知识再说。
41 楼 kingheaven 2009-06-23  
javaeye的引用嵌套没有限制的吗, 真厉害, 刚才嵌套了好几层了...
40 楼 kingheaven 2009-06-23  
xieye 写道
Xorcerer 写道
kingheaven 写道
xieye 写道
luolonghao 写道

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
            echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html> 



实际项目的页面怎么可能这么简单呢。。

所以,模板是肯定用到的。


PHP本身就是模板语言啊~所以不需要再使用任何模板了~把值传到PHP页面,直接拿PHP来处理输出就可以了。

我也是这样想的,看看Wordpress的模板的用法,就是如此,很简洁。


关于那个用class来当静态函数的容器,其实直接把函数写进同一个文件里就好了,完全不需要拿个class来包装。



类就相当于命令空间,这样可以有重名的函数。当然更好。不然得有多少下划线在函数名中。


这些问题到5.3和6.0里就迎刃而解啦~哈哈
39 楼 kingheaven 2009-06-23  
diogin 写道
only_java 写道
diogin 写道
only_java 写道
dualface 写道

php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧

你开玩笑吧,php没多线程?pcntl_fork

兄台,你开玩笑吧,pcntl_fork 是线程?

老兄不要跟我玩文字游戏好不?我的意思是可以实现多线程,老实讲我没搞过,只是记得某本书上讲过,所以不多做评论

PHP 脚本里不能实现多线程。网上流传的PHP脚本实现多线程的说法,基本上是不知道什么叫多线程。
PHP 解释器里的线程通过 TSRM 层已经完全对 PHP 脚本实现屏蔽。

Python 解释器上倒是允许在脚本层面控制线程。


我记得PHP的多线程是拿Apache模拟出来的, 不是真实的多线程.
38 楼 gordonAtJava 2009-06-23  
我没用过php,不过貌似oo的基本概念应该是一样的撒?

static不static主要还是看有没有对状态的依赖,如果没有的话,每次调用的所有变量都是本地的话,肯定就static咯,方便嘛,当然不用static,用单例也可以,但是static的时候就是classloader给做了单例了,一个loader里面就一个class的对象。

其实java的constructor里面一般都建议使用super(xxx)跟parent::__construct()应该是一个意思撒。

对象存在在运行时候的内存里面,每个对象都有到数据的引用和到非static的方法的引用。对象存在的意义主要是保持状态,然后非static的方法运行时候可以通过this这个bt的关键字作为上下文。
类是元素据啦,就是描述了结构(数据类型)和行为(方法的签名)的集合。运行时候类自己也会被加载,成为一个对象。static的属性和方法其实是这个 类对象 自己的东西,而不是 类实例化的对象 的东西。当然我比较不喜欢java的关于static的实现方式,但是鉴于是静态的,也没办法。

所有对象都有类,对象在运行时存在,运行时每个对象对应的类也是个对象,这个 类对象 本身也有个类, 所有 类对象 的类在java里面就是Class.class,运行时候这个Class本身也是一个对象..有点绕口撒

简单例子一个
Class A

运行时候如果某方法里面是

A a=....
这个时候
a.getClass()就是A,这个A是对象哦
a.getClass().getClass()就是Class,这个也是对象啦,运行时候啥都是对象嘛

只不过每个对象都能找到对应的class,里面描述了 这种对象的 元数据啦

很绕,自己看都糊涂

37 楼 diogin 2009-06-22  
only_java 写道
diogin 写道
only_java 写道
dualface 写道

php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧

你开玩笑吧,php没多线程?pcntl_fork

兄台,你开玩笑吧,pcntl_fork 是线程?

老兄不要跟我玩文字游戏好不?我的意思是可以实现多线程,老实讲我没搞过,只是记得某本书上讲过,所以不多做评论

PHP 脚本里不能实现多线程。网上流传的PHP脚本实现多线程的说法,基本上是不知道什么叫多线程。
PHP 解释器里的线程通过 TSRM 层已经完全对 PHP 脚本实现屏蔽。

Python 解释器上倒是允许在脚本层面控制线程。
36 楼 xieye 2009-06-22  
Xorcerer 写道
kingheaven 写道
xieye 写道
luolonghao 写道

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
            echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html> 



实际项目的页面怎么可能这么简单呢。。

所以,模板是肯定用到的。


PHP本身就是模板语言啊~所以不需要再使用任何模板了~把值传到PHP页面,直接拿PHP来处理输出就可以了。

我也是这样想的,看看Wordpress的模板的用法,就是如此,很简洁。


关于那个用class来当静态函数的容器,其实直接把函数写进同一个文件里就好了,完全不需要拿个class来包装。



类就相当于命令空间,这样可以有重名的函数。当然更好。不然得有多少下划线在函数名中。
35 楼 Xorcerer 2009-06-22  
kingheaven 写道
xieye 写道
luolonghao 写道

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
            echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html> 



实际项目的页面怎么可能这么简单呢。。

所以,模板是肯定用到的。


PHP本身就是模板语言啊~所以不需要再使用任何模板了~把值传到PHP页面,直接拿PHP来处理输出就可以了。

我也是这样想的,看看Wordpress的模板的用法,就是如此,很简洁。


关于那个用class来当静态函数的容器,其实直接把函数写进同一个文件里就好了,完全不需要拿个class来包装。
34 楼 kingheaven 2009-06-22  
xieye 写道
luolonghao 写道

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
            echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html> 



实际项目的页面怎么可能这么简单呢。。

所以,模板是肯定用到的。


PHP本身就是模板语言啊~所以不需要再使用任何模板了~把值传到PHP页面,直接拿PHP来处理输出就可以了。
33 楼 kingheaven 2009-06-22  
<div class="quote_title">only_java 写道</div>
<div class="quote_div">
<p> php5的面向对象虽然加强了很多,但还有很多东西比起java的面向对象弱了很多。有些东西甚至让人费解,就比如下面的代码,b extends a ,实例化b时a的构造函数却没执行?不知道实例化b时,php到底是则么执行的,高手来帮忙解惑!还有php的static成员竟然能在非static方法中使用,还好反过来会报错。好了,先贴代码</p>
<p> </p>
<pre name="code" class="php"> class a {

function __construct() {
echo "a";
}
}
class b extends  a{
function __construct(){

echo "b";
}

    private $x=100;
   public  static  function getx(){
    
     return $this-&gt;x;
   }
}
$x=new b();
echo $x-&gt;getx();</pre>
<p>  结果是:</p>
<p>     b100</p>
<p> “a”竟然没有输出,真不知到php里类初始化的顺序</p>
<p><span style="color: #ff0000;"><strong>补充:</strong></span></p>
<p><strong><span style="color: #ff0000;">  刚刚发现,原来是b的构造函数覆盖了a的构造函数,把b的构造函数去掉,就能输出a。真奇怪构造函数也能被覆盖?</span></strong></p>
</div>
<p> </p>
<p>哥们, 没用过C++吧~C++里子类的构造函数就会覆盖父类的,这只是语言的特性而已, PHP就是这么设计的, 不要拿java作为评判所有语言的标准。</p>
<p>还有,既然是静态方法了, 你还能写出$this来, 真佩服你, 从这就能看出来, 你java水平也不怎么样。。。</p>
32 楼 willko 2009-06-22  
pcntl_fork 是你写的程序,,而不是php本身。。
31 楼 only_java 2009-06-22  
diogin 写道
only_java 写道
dualface 写道

php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧

你开玩笑吧,php没多线程?pcntl_fork

兄台,你开玩笑吧,pcntl_fork 是线程?

老兄不要跟我玩文字游戏好不?我的意思是可以实现多线程,老实讲我没搞过,只是记得某本书上讲过,所以不多做评论
30 楼 only_java 2009-06-22  
楼上说的有道理,谢谢你的推荐!
29 楼 diogin 2009-06-20  
only_java 写道
diogin 写道
PHP是一门解释型语言,类的定义都是在运行时完成的,所以 static function 里使用了 $this,在编译时是无法捕获的,只有运行时才会碰到问题。你这么用是违反基本的面向对象原则的,只是因为PHP的动态特性,你可以这么写,但这是没意义的。

PHP跟Java还是有相当多的区别的,不要把Java那些运行原理拿来套PHP。

继承下来的子类,如果有构造函数,在实例化时PHP是不会主动调用父类的构造函数的,除非你在子类的构造函数里显式调用父类的构造函数。

是否面向对象不是看你有没有用 static。
面向对象与否是看你如何看待某个事物,而不是形式化的 class、static。

这位貌似是个高手,static function 里使用了 $this,在编译时是无法捕获的
但在实际执行时是正确的

是否面向对象不是看你有没有用 static。

我没说面向对象一定要用static,我只是好奇一个项目中的大部分类文件都是用static方法,甚至连个成员也没有。感觉起来有点当成函数使用一样,只不过这些函数在某个类下才能用。

面向对象与否是看你如何看待某个事物,而不是形式化的 class、static。
这句话感觉有点在讲哲学的味道,我觉得php中的面向对象最大的好处就是维护起来更好


如果只是拿个 class 套一下代码,所谓的“面向对象”“更好维护”基本是自我安慰。
面向对象编程受程序运行环境的影响是非常大的。在PHP解释器的运行环境上,很多传统的面向对象观念都需要转变,比如 static,比如什么是对象,什么是类,比如是否可以把类当成对象用,然后基于“类对象”使用原型继承,等等。

还是那句话,看一个设计是否优秀,不是看用没用上形式化的 class 之类,而是看开发者如何看待某事物。
没有成员的“类”就是不好的设计?不见得,只要你给它分配了很明确的职责,它就是一个良好的对象。

推荐一本OO经典,《对象设计:角色、责任与协作》。
28 楼 diogin 2009-06-20  
only_java 写道
dualface 写道

php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧

你开玩笑吧,php没多线程?pcntl_fork

兄台,你开玩笑吧,pcntl_fork 是线程?
27 楼 xieye 2009-06-20  
luolonghao 写道

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
            echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html> 



实际项目的页面怎么可能这么简单呢。。

所以,模板是肯定用到的。
26 楼 xieye 2009-06-20  
luolonghao 写道
记得PHP作者不建议使用框架和过度包装,PHP本身就是嵌入在HTML里的标签语言,感觉用PHP开发WEB程序继承都不需要用,函数+模板都可以处理大多数事情。


恐怕不是这样的吧,对任何语言来说,能重用代码都是一件好事情。
25 楼 luolonghao 2009-06-19  
lyhapple 写道
怎么忽然觉得PHP的语法这么BT啊..

return $this->x;

像火星文一样.-_-!


用Java思路写PHP简直是没事找麻烦。从PHP手册的例子看出PHP不是这么用的。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
            echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html> 

24 楼 luolonghao 2009-06-19  
only_java 写道
dualface 写道

php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧

你开玩笑吧,php没多线程?pcntl_fork


pcntl_fork — Forks the currently running process

相关推荐

    php零基础教材,适合不懂代码的人

    13. **面向对象编程**:深入理解类、对象、继承、封装和多态,提升代码复用性和可维护性。 14. **模板引擎**:了解如何使用模板引擎(如Smarty)分离业务逻辑和视图展示。 **实践项目** 本教程还包含了多个实际...

    百度贴吧内容采集php代码

    适合php初学者看,也适合不懂php的网站站长,因为这段百度贴吧内容采集php代码稍微修改就可以使用,可以初步满足个人站长的需求。其实百度贴吧内容的采集只要做好正则匹配,采集起来很容易。由于残冰也是初学php,...

    PHP资料大全,接个最低

    描述中列举了几个具体的文档,包括“PHP+4[1].0入门与提高(PDG)”、“PHP4 中文参考手册.chm”、“PHP_MySQL教程.chm”、“php面向对象初步入门教程pdf版”以及“PHP入门教程”和“PHP之Smarty入门.pdf”。...

    《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析

    刚接触javascript的时候,觉得这语言有点儿摸不着门道,感觉这玩意儿太难学了,没什么规范,没什么像样的手册,而且还跟html,dom,css打交道,更觉得一团糟,代码可读性也很差,面向过程的勉强能看懂,看面向对象的...

    精品php视频地址资源

    2. **面向对象编程(OOP)**:介绍类与对象的概念,如何设计类和实现继承、封装、多态等特性。 3. **数据库操作**:教授如何通过PHP连接MySQL等数据库,并执行增删改查等基本操作。 4. **Web开发框架**:如Laravel、...

    php100前100集视频下载地址(华为网盘)

    - **面向对象编程**:深入了解PHP中的类和对象,包括继承、封装和多态等概念。 - **数据库操作**:学习如何使用PHP连接MySQL等数据库,并进行增删改查等操作。 - **文件操作**:掌握文件读写、目录操作等技能。 - **...

    PHP从入门到精通(第2版)

    "PHP从入门到精通(第2版)"是一本关于PHP编程语言的教材,旨在帮助读者从完全不懂PHP到能够熟练使用PHP进行网页开发。 本书作为第二版,相较于第一版,应当在内容上进行了更新和扩充,以更好地适应PHP技术的发展和...

    PHP从入门到精通3th

    《PHP从入门到精通3th》这本书是一本专门为PHP编程语言的初学者设计的教程,目的是帮助他们从完全不懂PHP开始,逐步学习并最终达到精通PHP编程的水平。这本书详细介绍了PHP的基础知识、核心概念、常用函数、数据库...

    PHP实例开发源码-php杰奇小说仿二二书库.zip

    了解PHP的基础语法、面向对象编程、函数库以及与MySQL等数据库的整合是理解此项目的关键。 【压缩包子文件的文件名称列表】包括"使用须知.txt"和"132698577226185049"。"使用须知.txt"很可能是对项目如何安装、配置...

    php程序员述职报告(精选多篇).docx

    2. **自我提升**:程序员在工作中严格要求自己,遇到不懂的问题主动向同事请教,不断提升自己的技术能力,显示出自我学习和持续进步的精神。 3. **项目经验**:经过一段时间的工作,程序员能够独立负责模块的开发,...

    php Symfony The.Fast.Track

    而且对面向对象有很深的认识。 介绍了symfony这个领先的PHP开发框架,展示如何利用symfony的众多功能更快更有效率地开发Web应用程序,即使你只懂一点PHP也没有关系。在《Symfony》里,你将了解如何使用symfony建立...

    传智播客-PHP视频教程-初级

    - **查阅文档**:遇到不懂的地方可以查阅官方文档或相关资料加深理解。 - **参与社区**:加入PHP开发者社区(如Stack Overflow、GitHub等),与其他程序员交流经验,解决问题。 通过以上内容的学习,初学者将能够...

    php写的后台管理程序

    Yovae后台管理程序,程序大部分采用面向对象思想编写,MVC没有做到,有涉及Ajax技术,不过不多,这个程序我写了3天左右。 这个管理程序对于php的新手或想有进一步提升的朋友还是有蛮大的启发的,注释很少,我都用...

    [CMS程序]Typo3 dummy 4.26 (集成后台简体中文语言包)(PHP5+)_typo3-all.zip

    PHP 5.x提供了更稳定、更安全的执行环境,同时支持更多的特性,如面向对象编程、错误处理机制等,这些对于一个复杂的CMS系统至关重要。 **文件列表:【资料整理】** 虽然具体的文件列表未给出,但可以推测"【资料...

    基于PHP+Mysql实现的网上留言管理系统毕业设计(源代码+论文)

    面向对象;留言系统 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。

    PHP JS头像截取工具

    有人问:为什么只有PHP后端,没有JAVA和NET,很遗含告诉你,本人不懂JAVA和NET,但是以后的升级我会加上去的,当然你JAVA和NET玩得牛B,你可以在我的JS基础上编写。 目前shearphoto只支持PHP,如果你把JAVA或NET写了...

    基于PHP+MYSQL实现的社区签到积分奖励系统+源代码+文档说明+数据库sql

    签到数据库用Mysqli扩展库以面向对象的方式保存用户签到信息 目前功能和页面效果还在不断完善中,如有问题欢迎Issues中讨论 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok...

    shearphoto1.1+PHP头像截取,头像上传,切图工具,升级版!

    有人问:为什么只有PHP后端,没有JAVA和NET,很遗含告诉你,本人不懂JAVA和NET,但是以后的升级我会加上去的,当然你JAVA和NET玩得牛B,你可以在我的JS基础上编写。 目前shearphoto只支持PHP,如果你把JAVA或NET写了...

    如何突破PHP程序员的技术瓶颈分析

    对PHP的掌握不精(很多PHP手册都没有看完,库除外) 知识面比较窄(面对需求,除开使用PHP和mysql ,不知道其它的解决办法) PHP代码以过程为主,认为面向对象的实现太绕,看不懂 这些PHPer 在遇到需要高性能,处理...

Global site tag (gtag.js) - Google Analytics