锁定老帖子 主题:搞不懂php中的面向对象
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间: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里就迎刃而解啦~哈哈 |
|
返回顶楼 | |
发表时间:2009-06-23
javaeye的引用嵌套没有限制的吗, 真厉害, 刚才嵌套了好几层了...
|
|
返回顶楼 | |
发表时间:2009-06-24
PHP 没有线程这个概念。不要拿其他语言来套 php。
而且 static 函数里写 $this 本来就是错误的。php 开了 strict 就会有警告。但仍然允许执行是为了和 php4 的程序兼容。 强烈建议搞懂 php 的基础知识再说。 |
|
返回顶楼 | |
发表时间: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来包装。 类就相当于命令空间,这样可以有重名的函数。当然更好。不然得有多少下划线在函数名中。 文件本身也有类似命名空间的作用了。 |
|
返回顶楼 | |
发表时间: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 请求对象。 面向对象不是只有基于类这一种范型的,还有基于原型这种范型,而后者根本没有“类”的概念,一切都是对象,真正的对象,不属于任何类。继承也是直接继承对象。 |
|
返回顶楼 | |
发表时间:2009-06-24
only_java 写道 是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧? 由于php是每次请求,就会根据脚本重新分配内存,所以php框架的效率都很低,因为框架中有很多基础类是每次都需要用初始化,这不像tomcat,启动时有初始化过程,以后每次调用就不需要重新初始化.php每次请求完成以后就会释放所有内存,不会有内存泄漏,就算你程序写的很烂,也没问题. |
|
返回顶楼 | |
发表时间:2009-06-24
xgene 写道 only_java 写道 是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧? 由于php是每次请求,就会根据脚本重新分配内存,所以php框架的效率都很低,因为框架中有很多基础类是每次都需要用初始化,这不像tomcat,启动时有初始化过程,以后每次调用就不需要重新初始化.php每次请求完成以后就会释放所有内存,不会有内存泄漏,就算你程序写的很烂,也没问题. 不仅没有内存泄漏问题,也没有 static 变量的多线程同步问题,因为 PHP 脚本里根本没有线程。 总之,PHP 解释器已经帮你屏蔽掉了烦人的一切技术细节,你只需要专注于解决问题即可。 |
|
返回顶楼 | |
发表时间:2009-06-24
diogin 写道
xgene 写道
only_java 写道
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧? 由于php是每次请求,就会根据脚本重新分配内存,所以php框架的效率都很低,因为框架中有很多基础类是每次都需要用初始化,这不像tomcat,启动时有初始化过程,以后每次调用就不需要重新初始化.php每次请求完成以后就会释放所有内存,不会有内存泄漏,就算你程序写的很烂,也没问题. 不仅没有内存泄漏问题,也没有 static 变量的多线程同步问题,因为 PHP 脚本里根本没有线程。 总之,PHP 解释器已经帮你屏蔽掉了烦人的一切技术细节,你只需要专注于解决问题即可。
|
|
返回顶楼 | |
发表时间: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的机制?这样是为了动态部署么? |
|
返回顶楼 | |
发表时间: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 的运行环境还是请求到来就重建,请求结束就销毁。 这种运行方式的好处已经说了好多次了,方便部署方便修改,即时生效,程序员无需关注资源泄露,无需关注线程同步。但坏处也有,比如说对性能有影响,不过随着摩尔定律的持续生效,这不是问题。 |
|
返回顶楼 | |