论坛首页 编程语言技术论坛

搞不懂php中的面向对象

浏览 20991 次
精华帖 (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里就迎刃而解啦~哈哈
0 请登录后投票
   发表时间:2009-06-23  
javaeye的引用嵌套没有限制的吗, 真厉害, 刚才嵌套了好几层了...
0 请登录后投票
   发表时间:2009-06-24  
PHP 没有线程这个概念。不要拿其他语言来套 php。

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

强烈建议搞懂 php 的基础知识再说。
0 请登录后投票
   发表时间: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来包装。



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

文件本身也有类似命名空间的作用了。
0 请登录后投票
   发表时间: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 请求对象。

面向对象不是只有基于类这一种范型的,还有基于原型这种范型,而后者根本没有“类”的概念,一切都是对象,真正的对象,不属于任何类。继承也是直接继承对象。
0 请登录后投票
   发表时间:2009-06-24  
only_java 写道
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧?


由于php是每次请求,就会根据脚本重新分配内存,所以php框架的效率都很低,因为框架中有很多基础类是每次都需要用初始化,这不像tomcat,启动时有初始化过程,以后每次调用就不需要重新初始化.php每次请求完成以后就会释放所有内存,不会有内存泄漏,就算你程序写的很烂,也没问题.
0 请登录后投票
   发表时间:2009-06-24  
xgene 写道
only_java 写道
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧?


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


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

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


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


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

总之,PHP 解释器已经帮你屏蔽掉了烦人的一切技术细节,你只需要专注于解决问题即可。


高人,谢谢指点!PHP] PHP框架的繁荣是正确的发展方向吗? 这个帖子让我受益匪浅啊!

 

0 请登录后投票
   发表时间: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的机制?这样是为了动态部署么?
0 请登录后投票
   发表时间: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 的运行环境还是请求到来就重建,请求结束就销毁。

这种运行方式的好处已经说了好多次了,方便部署方便修改,即时生效,程序员无需关注资源泄露,无需关注线程同步。但坏处也有,比如说对性能有影响,不过随着摩尔定律的持续生效,这不是问题。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics