`
only_java
  • 浏览: 113448 次
  • 性别: 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。真奇怪构造函数也能被覆盖?

分享到:
评论
23 楼 lyhapple 2009-06-19  
怎么忽然觉得PHP的语法这么BT啊..

return $this->x;

像火星文一样.-_-!
22 楼 only_java 2009-06-19  
luolonghao 写道

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

我开始也是你这么想的,但是现在觉得框架不是不需要,要看什么场合。简单的项目就无所谓了,但中型项目用框架还是可以减少很多重复工作。而且维护性,扩展性比较强!
21 楼 luolonghao 2009-06-19  
记得PHP作者不建议使用框架和过度包装,PHP本身就是嵌入在HTML里的标签语言,感觉用PHP开发WEB程序继承都不需要用,函数+模板都可以处理大多数事情。
20 楼 only_java 2009-06-19  
dualface 写道

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

你开玩笑吧,php没多线程?pcntl_fork
19 楼 dualface 2009-06-19  
php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧
18 楼 only_java 2009-06-19  
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧?
17 楼 xieye 2009-06-19  
only_java 写道

呵呵,最近才研究ZEND!下次有问题还得多多指教哈!关于性能问题,需要更深入的研究啊。我想问下:
classname::method()执行的时候应该首先要加载类,这肯定会占内存。如果在一个页面或一个功能中用如下两种方式:
1.先new对象,然后在下面多处调用方法。这里new的时候分配了一次内存
2.全部用static方法,在下面多处地方调用静态方法,每次调用是不是都会分配一次内存?这样是否造成了性能下降?


这里没看明白,在一个页面中全部用静态方法,多次的调用,每个方法执行完,里面的局部变量不是全部回收了吗?那自然没关系。
但是多线程的话,只能是多处使用内存了。

至于加载类的内存,那是没办法的,必须要占用的。

16 楼 only_java 2009-06-19  
diogin 写道
PHP是一门解释型语言,类的定义都是在运行时完成的,所以 static function 里使用了 $this,在编译时是无法捕获的,只有运行时才会碰到问题。你这么用是违反基本的面向对象原则的,只是因为PHP的动态特性,你可以这么写,但这是没意义的。

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

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

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

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

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

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

面向对象与否是看你如何看待某个事物,而不是形式化的 class、static。
这句话感觉有点在讲哲学的味道,我觉得php中的面向对象最大的好处就是维护起来更好
15 楼 only_java 2009-06-19  
xieye 写道
only_java 写道
xieye 写道
关于static的问题,是php语言要保持向前兼容的代价。

如果直接用php5编程,则尽量使用static的本来意义,那么使用方法和java极为类似。

static方法由类直接调用,当然里面不要有this。(即便程序不报错,也别这样用)

非静态方法应该由对象调用,里面可以有this。

老兄这些你说是正确的,但好像你搞错了吧?成员$x是非静态的,仔细看我的回复!
这里应该分为两种情况吧?
1.静态方法调用非静态成员
   这种就是我发的代码中的情况,少见,一般不会这样做
2.普通方法调用静态方法
  这种情况,一般用来注册类中的某个成员,比如zf中
  Zend_Db_Table::setDefaultAdapter($dbAdapter);
在Zend_db_table中注册$dbAdapter 。  然后用 普通方法调用静态方法(此方法获取静态成员的值)
比较实用,对于静态方法的使用。我觉得有时候容易过度,像我们公司现在一个类下面基本上是静态方法,这样下来类变成了类似java里面的包了,这样感觉就是把一些相关的函数聚在一起用一个包来管理了。感觉太极端了,这样会不会造成加载时候的性能问题?但这样做确实很方便!



原来也用Zend,握手。
根据我自己的经验,为保持兼容,非静态方法照样可以用类名::方法名()这样调用,但是这样的写法含混不清,所以我自己的代码都会把确定由类调用的方法前加上static,并且确保里面没有$this。

非静态方法是可以调用本类或别的类里的静态方法的。
本类用self::静态方法名()
别的类,要先加载那个文件,最好在类外加载,然后在方法里别的类的类名::静态方法名()

至于性能问题,应该没什么影响。



呵呵,最近才研究ZEND!下次有问题还得多多指教哈!关于性能问题,需要更深入的研究啊。我想问下:
classname::method()执行的时候应该首先要加载类,这肯定会占内存。如果在一个页面或一个功能中用如下两种方式:
1.先new对象,然后在下面多处调用方法。这里new的时候分配了一次内存
2.全部用static方法,在下面多处地方调用静态方法,每次调用是不是都会分配一次内存?这样是否造成了性能下降?
14 楼 only_java 2009-06-19  
xieye 写道
既然你诚心诚意的问了,
我只好。。。。。。。。。。。。。。。努力查资料:

实例化就是一个调用构造方法:
1、构造方法可以接收参数。
2、构造方法里可以调用本类的其他方法。
3、构造方法里可以调用别的构造方法,包括父类的构造方法和与本类完全无继承关系的别的类的构造方法
4、php4和php5的构造方法形式不同,php4是类名,php5是__construct,虽然php5兼容php4的语法,但是建议如果是php5就按php5的语法写。
5、多生成一个对象,就多占用一份内存,这句话是我猜的,并且应该和字段多少有关。



兄台是不是忘了考虑静态成员的初始化了吧?还有const常量?
那它会不会像java中那样首先初始话父类的静态成员再初始化子类的静态成员,然后在调用构造函数?
new一个对象肯定是要占堆内存的啊,也肯定和字段有关!一直还以JAVA那套来对待Php面向对象,导致有时候让人难以理解!汗
13 楼 diogin 2009-06-19  
PHP是一门解释型语言,类的定义都是在运行时完成的,所以 static function 里使用了 $this,在编译时是无法捕获的,只有运行时才会碰到问题。你这么用是违反基本的面向对象原则的,只是因为PHP的动态特性,你可以这么写,但这是没意义的。

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

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

是否面向对象不是看你有没有用 static。
面向对象与否是看你如何看待某个事物,而不是形式化的 class、static。
12 楼 xieye 2009-06-19  
only_java 写道
xieye 写道
关于static的问题,是php语言要保持向前兼容的代价。

如果直接用php5编程,则尽量使用static的本来意义,那么使用方法和java极为类似。

static方法由类直接调用,当然里面不要有this。(即便程序不报错,也别这样用)

非静态方法应该由对象调用,里面可以有this。

老兄这些你说是正确的,但好像你搞错了吧?成员$x是非静态的,仔细看我的回复!
这里应该分为两种情况吧?
1.静态方法调用非静态成员
   这种就是我发的代码中的情况,少见,一般不会这样做
2.普通方法调用静态方法
  这种情况,一般用来注册类中的某个成员,比如zf中
  Zend_Db_Table::setDefaultAdapter($dbAdapter);
在Zend_db_table中注册$dbAdapter 。  然后用 普通方法调用静态方法(此方法获取静态成员的值)
比较实用,对于静态方法的使用。我觉得有时候容易过度,像我们公司现在一个类下面基本上是静态方法,这样下来类变成了类似java里面的包了,这样感觉就是把一些相关的函数聚在一起用一个包来管理了。感觉太极端了,这样会不会造成加载时候的性能问题?但这样做确实很方便!



原来也用Zend,握手。
根据我自己的经验,为保持兼容,非静态方法照样可以用类名::方法名()这样调用,但是这样的写法含混不清,所以我自己的代码都会把确定由类调用的方法前加上static,并且确保里面没有$this。

非静态方法是可以调用本类或别的类里的静态方法的。
本类用self::静态方法名()
别的类,要先加载那个文件,最好在类外加载,然后在方法里别的类的类名::静态方法名()

至于性能问题,应该没什么影响。


11 楼 xieye 2009-06-19  
补充:
1、如果父类有构造方法,子类没有构造方法,则子类实例化时会自动调用父类构造方法
2、除了这种写法
     function __construct(){
         parent::__construct(); //不能少     
         echo "b";
     } 
还可以这样写
     function __construct(){
         b::__construct(); //不能少     
         echo "b";
     } 
10 楼 xieye 2009-06-19  
既然你诚心诚意的问了,
我只好。。。。。。。。。。。。。。。努力查资料:

实例化就是一个调用构造方法:
1、构造方法可以接收参数。
2、构造方法里可以调用本类的其他方法。
3、构造方法里可以调用别的构造方法,包括父类的构造方法和与本类完全无继承关系的别的类的构造方法
4、php4和php5的构造方法形式不同,php4是类名,php5是__construct,虽然php5兼容php4的语法,但是建议如果是php5就按php5的语法写。
5、多生成一个对象,就多占用一份内存,这句话是我猜的,并且应该和字段多少有关。


9 楼 only_java 2009-06-19  
xieye 写道
关于static的问题,是php语言要保持向前兼容的代价。

如果直接用php5编程,则尽量使用static的本来意义,那么使用方法和java极为类似。

static方法由类直接调用,当然里面不要有this。(即便程序不报错,也别这样用)

非静态方法应该由对象调用,里面可以有this。

老兄这些你说是正确的,但好像你搞错了吧?成员$x是非静态的,仔细看我的回复!
这里应该分为两种情况吧?
1.静态方法调用非静态成员
   这种就是我发的代码中的情况,少见,一般不会这样做
2.普通方法调用静态方法
  这种情况,一般用来注册类中的某个成员,比如zf中
  Zend_Db_Table::setDefaultAdapter($dbAdapter);
在Zend_db_table中注册$dbAdapter 。  然后用 普通方法调用静态方法(此方法获取静态成员的值)
比较实用,对于静态方法的使用。我觉得有时候容易过度,像我们公司现在一个类下面基本上是静态方法,这样下来类变成了类似java里面的包了,这样感觉就是把一些相关的函数聚在一起用一个包来管理了。感觉太极端了,这样会不会造成加载时候的性能问题?但这样做确实很方便!

8 楼 only_java 2009-06-19  
xieye 写道
only_java 写道

我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗?

残念。。
php不是java,很多理念本来就不一样。

那能否帮忙讲下Php里面类实例化到底做了哪些东西呢?
7 楼 xieye 2009-06-19  
关于static的问题,是php语言要保持向前兼容的代价。

如果直接用php5编程,则尽量使用static的本来意义,那么使用方法和java极为类似。

static方法由类直接调用,当然里面不要有this。(即便程序不报错,也别这样用)

非静态方法应该由对象调用,里面可以有this。
6 楼 xieye 2009-06-19  
only_java 写道

我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗?

残念。。
php不是java,很多理念本来就不一样。
5 楼 only_java 2009-06-19  
willko 写道
为什么会在静态方法里调用this??

其实我也觉得奇怪,因为静态方法里面竟然还能使用非静态成员!这在java中肯定是要保错的,仔细想想,类在加载的时候根本没初始话非静态成员。而静态方法可以在未初始话之前调用,意思就是可能在非静态成员未赋值的情况下调用静态方法。这在java里面肯定要报错误:未初始化,但在Php中,因为是有默认值的所以就可以通过吧
4 楼 only_java 2009-06-19  
xieye 写道
楼主呀,基础不扎实。。

通常的写法是:

 class a {

	function __construct() {
		echo "a";
	}
}
class b extends  a{
	parent::__construct(); //不能少
        function __construct(){
	 
		echo "b";
	}
	
    private $x=100;
   public  function getx(){
   	  
   	  return $this->x; 
   }
}
$x=new b();
echo $x->getx();

我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗?

相关推荐

    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