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

分享到:
评论
63 楼 wxwswjws 2009-08-31  
c++和java调用构造函数时会自动调用父类的,php不会
62 楼 syre 2009-08-18  
父类如果有构造函数,子类没覆盖的话当然也会调用。
lz 的例子是子类覆盖了父类的构造函数。。。。
61 楼 yanglei922 2009-07-17  
(接上)
子类可以继承超类的任何方法,可构造器是不能被继承的。
为了弥补这个问题现在的java编译器(javac.exe)会自动处理,
例如public class Example {}
会自动编译public class Example { Example() {super();} }
而PHP编译器不会自动处理,这是产生现象的根本原因
60 楼 yanglei922 2009-07-17  
离题远了,java里如果构造器没有

super()方法也不会调用父类的构造器,呵呵
59 楼 zhuchanglin 2009-07-10  
没必要计较,语言让你怎么用你就怎么用,没什么习惯不习惯的,用多了就好了。能得到正确结果就行。
58 楼 java_struts 2009-07-02  
不要拿java来说事
57 楼 kingheaven 2009-07-01  
diogin 写道
kingheaven 写道
比较本身的性能意义已经不大了, 因为在实际的使用过程当中, 缓存等优化手段都会加进来, 那个时候, 谁优化的好和优化的空间大, 才是性能的关键了


实际上根本没必要在性能这个点上抠,python、ruby、php、perl 在 web 上的性能都差不多。

对于开发来说,最重要的是开发效率如何,以及架构设计得如何。单机再牛也有跑到瓶颈的时候,这时候能否扩展出去就是架构方面的问题,跟语言根本没关系。性能再好,开发效率却很低,也没人会用,看看有多少人用 C 写 web 程序?

看看全球排名前几的网站,分享的资料都是他们的架构如何如何,基本没看到他们吹嘘使用的是什么语言,该语言性能如何。所以比较语言性能基本没意义。对于框架设计者来说,不如多花些时间思考如何能让自己的框架适应分布式的大型网站。


同意diogin.

OO带来的是开发的便捷和维护的方便, 而不是性能的提升, 函数式的编程肯定要比OO性能好, 但是开发和维护并不一定就容易.

架构永远要高于语言.
56 楼 xieye 2009-07-01  
diogin 写道

实际上根本没必要在性能这个点上抠,python、ruby、php、perl 在 web 上的性能都差不多。

对于开发来说,最重要的是开发效率如何,以及架构设计得如何。单机再牛也有跑到瓶颈的时候,这时候能否扩展出去就是架构方面的问题,跟语言根本没关系。性能再好,开发效率却很低,也没人会用,看看有多少人用 C 写 web 程序?

看看全球排名前几的网站,分享的资料都是他们的架构如何如何,基本没看到他们吹嘘使用的是什么语言,该语言性能如何。所以比较语言性能基本没意义。对于框架设计者来说,不如多花些时间思考如何能让自己的框架适应分布式的大型网站。


面向对象的思想我感觉能更好的适应大型系统,不是指性能,而是指开发速度快,代码易读易维护等。也能并应该更好的利用各种设计模式
55 楼 chenlixun 2009-06-30  
讨论的话题越来越偏了,汗~

注意素质
54 楼 diogin 2009-06-30  
kingheaven 写道
比较本身的性能意义已经不大了, 因为在实际的使用过程当中, 缓存等优化手段都会加进来, 那个时候, 谁优化的好和优化的空间大, 才是性能的关键了


实际上根本没必要在性能这个点上抠,python、ruby、php、perl 在 web 上的性能都差不多。

对于开发来说,最重要的是开发效率如何,以及架构设计得如何。单机再牛也有跑到瓶颈的时候,这时候能否扩展出去就是架构方面的问题,跟语言根本没关系。性能再好,开发效率却很低,也没人会用,看看有多少人用 C 写 web 程序?

看看全球排名前几的网站,分享的资料都是他们的架构如何如何,基本没看到他们吹嘘使用的是什么语言,该语言性能如何。所以比较语言性能基本没意义。对于框架设计者来说,不如多花些时间思考如何能让自己的框架适应分布式的大型网站。
53 楼 Julien 2009-06-30  
总之xcache就是php的预读机制……
别强迫没有xcache的php跟ruby比较……
52 楼 kingheaven 2009-06-30  
比较本身的性能意义已经不大了, 因为在实际的使用过程当中, 缓存等优化手段都会加进来, 那个时候, 谁优化的好和优化的空间大, 才是性能的关键了
51 楼 dualface 2009-06-27  
php 虽然是解释执行的,但是比 ruby 之类的快了一个数量级。

至于说 php 框架性能不如 rails,原因主要有两个:

1、用了 cakephp、zf 这些本来就很慢的框架来和 rails 比较;
2、没有最优化 php 的运行环境。

而且 php 本身的运行环境是 C 写的,启动后就包括了 web 应用需要的一切基础功能。而 ruby、python 这样的通用脚本语言,都需要单独的编写 web 基础功能库。
50 楼 imhades 2009-06-26  
别把JAVA作为标准来跟PHP来比,PHP这样的设计是为了高效率,不信的话可以查资料.
49 楼 diogin 2009-06-26  
gordonAtJava 写道
diogin 写道
gordonAtJava 写道
我没用过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,里面描述了 这种对象的 元数据啦

很绕,自己看都糊涂


不要拿 Java 的 OO 环境来套其它环境。

基于类的面向对象编程语言中,static 存在的意义是什么? static 成员挂在 class 上,它就应该是 class 的状态,它的生命期跟 class 的生命期是一样的。把 class 当成“对象”使用,static 就是这个“对象”的属性。

在 Java 里面,class 被虚拟机加载,生命期跟虚拟机进程一样的,不受 HTTP 请求的影响。

在 PHP 里面,class 是在请求过来后编译生成的,请求完成后 class 销毁,它的生命期是“瞬态”的,它受 HTTP 请求影响,虽然 PHP 解释器是持久的。因此严格地说,PHP 的 class 只是 Java 里面的对象。如果在 PHP 里面封装 HTTP 请求类,那么这个类就没必要再实例化,因为这个“类”本身就已经是对象,它在请求到来时生成,在请求结束时完蛋。而在 Java 虚拟机上,就应该每收到一个请求就实例化出该请求类的实例,结束时销毁该实例,因为在 JVM 上类是持久的,而 PHP 不是。PHP 根本没必要去实例化 HTTP 请求类,类本身就已经是 HTTP 请求对象。

面向对象不是只有基于类这一种范型的,还有基于原型这种范型,而后者根本没有“类”的概念,一切都是对象,真正的对象,不属于任何类。继承也是直接继承对象。


我一直以为基于prototype叫做object-based,不叫object-oriented~~~

请问php的一个对象是否包对应含类的信息? 如果包含的话每次http request都重新构造的话,开销是否会比较大?会不会有基于token或者timestamp之类的cache的机制?这样是为了动态部署么?


object-based 的意思是说没有多态和继承。prototype-based 是一种正宗的 OO 范型,而不是 OB 范型,详见:
http://en.wikipedia.org/wiki/Prototype-based_programming

PHP 解释器运行时,碰到 HTTP 请求就读入请求里指定的 php 文件,编译它,运行生成的 opcode,碰到 require/include 之类的指令时,就再读入对应的 php 文件,编译它,运行生成的 opcode,如此反复,直到该次请求执行完成,再销毁所有的 opcode,释放该次请求中脚本申请的所有资源。因此脚本里的一切东西,生命期都只限于一次请求(除非显式告诉解释器,某个变量在内部实现上应该是持久的,比如 mysql_pconnect 对应的资源,或者自己编写扩展实现跨请求共享的变量,这很容易,但在无状态 HTTP 的光辉指引下基本没人这么做)。

如果你加载了 opcode cache,比如 APC、eAccelerator、XCache,那么可以缓存 opcode,这样每次请求过来时可以选择不用重复编译 php 文件和不再 stat 调用 php 文件。如果是后者,opcode 的原理就跟 Python 的 pyc 差不多了,不过运行环境上还是有本质的不同,除了 opcode 不用再反复生成外,PHP 的运行环境还是请求到来就重建,请求结束就销毁。

这种运行方式的好处已经说了好多次了,方便部署方便修改,即时生效,程序员无需关注资源泄露,无需关注线程同步。但坏处也有,比如说对性能有影响,不过随着摩尔定律的持续生效,这不是问题。
48 楼 gordonAtJava 2009-06-26  
diogin 写道
gordonAtJava 写道
我没用过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,里面描述了 这种对象的 元数据啦

很绕,自己看都糊涂


不要拿 Java 的 OO 环境来套其它环境。

基于类的面向对象编程语言中,static 存在的意义是什么? static 成员挂在 class 上,它就应该是 class 的状态,它的生命期跟 class 的生命期是一样的。把 class 当成“对象”使用,static 就是这个“对象”的属性。

在 Java 里面,class 被虚拟机加载,生命期跟虚拟机进程一样的,不受 HTTP 请求的影响。

在 PHP 里面,class 是在请求过来后编译生成的,请求完成后 class 销毁,它的生命期是“瞬态”的,它受 HTTP 请求影响,虽然 PHP 解释器是持久的。因此严格地说,PHP 的 class 只是 Java 里面的对象。如果在 PHP 里面封装 HTTP 请求类,那么这个类就没必要再实例化,因为这个“类”本身就已经是对象,它在请求到来时生成,在请求结束时完蛋。而在 Java 虚拟机上,就应该每收到一个请求就实例化出该请求类的实例,结束时销毁该实例,因为在 JVM 上类是持久的,而 PHP 不是。PHP 根本没必要去实例化 HTTP 请求类,类本身就已经是 HTTP 请求对象。

面向对象不是只有基于类这一种范型的,还有基于原型这种范型,而后者根本没有“类”的概念,一切都是对象,真正的对象,不属于任何类。继承也是直接继承对象。


我一直以为基于prototype叫做object-based,不叫object-oriented~~~

请问php的一个对象是否包对应含类的信息? 如果包含的话每次http request都重新构造的话,开销是否会比较大?会不会有基于token或者timestamp之类的cache的机制?这样是为了动态部署么?
47 楼 only_java 2009-06-24  
<div class="quote_title">diogin 写道</div>
<div class="quote_div">
<div class="quote_title">xgene 写道</div>
<div class="quote_div">
<div class="quote_title">only_java 写道</div>
<div class="quote_div">是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢? <br>多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧?</div>
<br><br>由于php是每次请求,就会根据脚本重新分配内存,所以php框架的效率都很低,因为框架中有很多基础类是每次都需要用初始化,这不像tomcat,启动时有初始化过程,以后每次调用就不需要重新初始化.php每次请求完成以后就会释放所有内存,不会有内存泄漏,就算你程序写的很烂,也没问题.</div>
<br><br>不仅没有内存泄漏问题,也没有 static 变量的多线程同步问题,因为 PHP 脚本里根本没有线程。 <br><br>总之,PHP 解释器已经帮你屏蔽掉了烦人的一切技术细节,你只需要专注于解决问题即可。</div>
<p><br>高人,谢谢指点!<a href="/topic/319039"><span style="color: #006699;">PHP] PHP框架的繁荣是正确的发展方向吗?</span> </a>这个帖子让我受益匪浅啊!</p>
<p> </p>
46 楼 diogin 2009-06-24  
xgene 写道
only_java 写道
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧?


由于php是每次请求,就会根据脚本重新分配内存,所以php框架的效率都很低,因为框架中有很多基础类是每次都需要用初始化,这不像tomcat,启动时有初始化过程,以后每次调用就不需要重新初始化.php每次请求完成以后就会释放所有内存,不会有内存泄漏,就算你程序写的很烂,也没问题.


不仅没有内存泄漏问题,也没有 static 变量的多线程同步问题,因为 PHP 脚本里根本没有线程。

总之,PHP 解释器已经帮你屏蔽掉了烦人的一切技术细节,你只需要专注于解决问题即可。
45 楼 xgene 2009-06-24  
only_java 写道
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧?


由于php是每次请求,就会根据脚本重新分配内存,所以php框架的效率都很低,因为框架中有很多基础类是每次都需要用初始化,这不像tomcat,启动时有初始化过程,以后每次调用就不需要重新初始化.php每次请求完成以后就会释放所有内存,不会有内存泄漏,就算你程序写的很烂,也没问题.
44 楼 diogin 2009-06-24  
gordonAtJava 写道
我没用过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,里面描述了 这种对象的 元数据啦

很绕,自己看都糊涂


不要拿 Java 的 OO 环境来套其它环境。

基于类的面向对象编程语言中,static 存在的意义是什么? static 成员挂在 class 上,它就应该是 class 的状态,它的生命期跟 class 的生命期是一样的。把 class 当成“对象”使用,static 就是这个“对象”的属性。

在 Java 里面,class 被虚拟机加载,生命期跟虚拟机进程一样的,不受 HTTP 请求的影响。

在 PHP 里面,class 是在请求过来后编译生成的,请求完成后 class 销毁,它的生命期是“瞬态”的,它受 HTTP 请求影响,虽然 PHP 解释器是持久的。因此严格地说,PHP 的 class 只是 Java 里面的对象。如果在 PHP 里面封装 HTTP 请求类,那么这个类就没必要再实例化,因为这个“类”本身就已经是对象,它在请求到来时生成,在请求结束时完蛋。而在 Java 虚拟机上,就应该每收到一个请求就实例化出该请求类的实例,结束时销毁该实例,因为在 JVM 上类是持久的,而 PHP 不是。PHP 根本没必要去实例化 HTTP 请求类,类本身就已经是 HTTP 请求对象。

面向对象不是只有基于类这一种范型的,还有基于原型这种范型,而后者根本没有“类”的概念,一切都是对象,真正的对象,不属于任何类。继承也是直接继承对象。

相关推荐

    PHP面向对象程序设计中的self、static、parent关键字用法分析

    本文实例讲述了PHP面向对象程序设计中的self、static、parent关键字用法.分享给大家供大家参考,具体如下: 看到php里面有关于后期静态绑定的内容,虽然没有完全看懂,但是也收获不少东西。 php官方手册介绍: ...

    php类实例教程让更多的PHPer开始转向OO的编程过程

    从OOP(面向对象)的视角看,不应区分语言。无论是C++、无论是Java、无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思想轻松的跳跃。便没有对于Java、.net 、 PHP 之间谁强谁弱的...

    百度贴吧内容采集php代码

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

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

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

    php Symfony The.Fast.Track

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

    php写的后台管理程序

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

    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 在遇到需要高性能,处理...

    基于微信小程序购物商城设计+源代码+文档说明+数据库.zip

    服务器端采用Thinkphp5.0开发接口,服务器端采用了统一的自定义验证框架层和异常处理层,整个项目才用了面向对象的设计方法,以及面向切面编程AOP思想,是学习的精品资料! -------- 不懂运行,下载完可以私聊问,可...

    Web 开发敏捷之道(应用Rails 进行敏捷Web 开发第三版)

    Rails 应用是用Ruby 编写的,这是一种现代的面向对象脚本语言。Ruby 很简洁,却又不致简练 得难以理解。使用Ruby,你可以自然而清晰地表述自己的想法,因此,Ruby 程序很容易编写,而且放 上几个月之后也很容易读懂...

Global site tag (gtag.js) - Google Analytics