锁定老帖子 主题:搞不懂php中的面向对象
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-19
既然你诚心诚意的问了,
我只好。。。。。。。。。。。。。。。努力查资料: 实例化就是一个调用构造方法: 1、构造方法可以接收参数。 2、构造方法里可以调用本类的其他方法。 3、构造方法里可以调用别的构造方法,包括父类的构造方法和与本类完全无继承关系的别的类的构造方法 4、php4和php5的构造方法形式不同,php4是类名,php5是__construct,虽然php5兼容php4的语法,但是建议如果是php5就按php5的语法写。 5、多生成一个对象,就多占用一份内存,这句话是我猜的,并且应该和字段多少有关。 |
|
返回顶楼 | |
发表时间:2009-06-19
补充:
1、如果父类有构造方法,子类没有构造方法,则子类实例化时会自动调用父类构造方法 2、除了这种写法 function __construct(){ parent::__construct(); //不能少 echo "b"; } 还可以这样写 function __construct(){ b::__construct(); //不能少 echo "b"; } |
|
返回顶楼 | |
发表时间: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::静态方法名() 别的类,要先加载那个文件,最好在类外加载,然后在方法里别的类的类名::静态方法名() 至于性能问题,应该没什么影响。 |
|
返回顶楼 | |
发表时间:2009-06-19
PHP是一门解释型语言,类的定义都是在运行时完成的,所以 static function 里使用了 $this,在编译时是无法捕获的,只有运行时才会碰到问题。你这么用是违反基本的面向对象原则的,只是因为PHP的动态特性,你可以这么写,但这是没意义的。
PHP跟Java还是有相当多的区别的,不要把Java那些运行原理拿来套PHP。 继承下来的子类,如果有构造函数,在实例化时PHP是不会主动调用父类的构造函数的,除非你在子类的构造函数里显式调用父类的构造函数。 是否面向对象不是看你有没有用 static。 面向对象与否是看你如何看待某个事物,而不是形式化的 class、static。 |
|
返回顶楼 | |
发表时间:2009-06-19
xieye 写道 既然你诚心诚意的问了,
我只好。。。。。。。。。。。。。。。努力查资料: 实例化就是一个调用构造方法: 1、构造方法可以接收参数。 2、构造方法里可以调用本类的其他方法。 3、构造方法里可以调用别的构造方法,包括父类的构造方法和与本类完全无继承关系的别的类的构造方法 4、php4和php5的构造方法形式不同,php4是类名,php5是__construct,虽然php5兼容php4的语法,但是建议如果是php5就按php5的语法写。 5、多生成一个对象,就多占用一份内存,这句话是我猜的,并且应该和字段多少有关。 兄台是不是忘了考虑静态成员的初始化了吧?还有const常量? 那它会不会像java中那样首先初始话父类的静态成员再初始化子类的静态成员,然后在调用构造函数? new一个对象肯定是要占堆内存的啊,也肯定和字段有关!一直还以JAVA那套来对待Php面向对象,导致有时候让人难以理解!汗 |
|
返回顶楼 | |
发表时间: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方法,在下面多处地方调用静态方法,每次调用是不是都会分配一次内存?这样是否造成了性能下降? |
|
返回顶楼 | |
发表时间: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中的面向对象最大的好处就是维护起来更好 |
|
返回顶楼 | |
发表时间:2009-06-19
only_java 写道 呵呵,最近才研究ZEND!下次有问题还得多多指教哈!关于性能问题,需要更深入的研究啊。我想问下: classname::method()执行的时候应该首先要加载类,这肯定会占内存。如果在一个页面或一个功能中用如下两种方式: 1.先new对象,然后在下面多处调用方法。这里new的时候分配了一次内存 2.全部用static方法,在下面多处地方调用静态方法,每次调用是不是都会分配一次内存?这样是否造成了性能下降? 这里没看明白,在一个页面中全部用静态方法,多次的调用,每个方法执行完,里面的局部变量不是全部回收了吗?那自然没关系。 但是多线程的话,只能是多处使用内存了。 至于加载类的内存,那是没办法的,必须要占用的。 |
|
返回顶楼 | |
发表时间:2009-06-19
是回收了,但是下次调用的时候又得分配内存,来回的分配会不会降低性能呢?
多线程的话用静态成员的话应该会造成变量共享造成的问题。但php很少用多线程吧?apache处理每次请求的时候都是不同的线程吧? |
|
返回顶楼 | |
发表时间:2009-06-19
php 没有线程,运行模式也和 java 完全不同,还是多多补充基础知识吧
|
|
返回顶楼 | |