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

搞不懂php中的面向对象

浏览 20986 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-06-19  
既然你诚心诚意的问了,
我只好。。。。。。。。。。。。。。。努力查资料:

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


1 请登录后投票
   发表时间:2009-06-19  
补充:
1、如果父类有构造方法,子类没有构造方法,则子类实例化时会自动调用父类构造方法
2、除了这种写法
     function __construct(){
         parent::__construct(); //不能少     
         echo "b";
     } 
还可以这样写
     function __construct(){
         b::__construct(); //不能少     
         echo "b";
     } 
0 请登录后投票
   发表时间: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::静态方法名()
别的类,要先加载那个文件,最好在类外加载,然后在方法里别的类的类名::静态方法名()

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


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

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

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

是否面向对象不是看你有没有用 static。
面向对象与否是看你如何看待某个事物,而不是形式化的 class、static。
0 请登录后投票
   发表时间:2009-06-19  
xieye 写道
既然你诚心诚意的问了,
我只好。。。。。。。。。。。。。。。努力查资料:

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



兄台是不是忘了考虑静态成员的初始化了吧?还有const常量?
那它会不会像java中那样首先初始话父类的静态成员再初始化子类的静态成员,然后在调用构造函数?
new一个对象肯定是要占堆内存的啊,也肯定和字段有关!一直还以JAVA那套来对待Php面向对象,导致有时候让人难以理解!汗
0 请登录后投票
   发表时间: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方法,在下面多处地方调用静态方法,每次调用是不是都会分配一次内存?这样是否造成了性能下降?
0 请登录后投票
   发表时间: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中的面向对象最大的好处就是维护起来更好
0 请登录后投票
   发表时间:2009-06-19  
only_java 写道

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


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

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

0 请登录后投票
   发表时间:2009-06-19  
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧?
0 请登录后投票
   发表时间:2009-06-19  
php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧
0 请登录后投票
论坛首页 编程语言技术版

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