php5中类的学习


Posted in PHP onMarch 28, 2008
<?php      
class TEST      
{      
    const NAME = 'value'; // 常量      
    public $name = 'value'; // 属性      
    public function name() // 方法      
    {      
        echo 'value';      
    }      
}      
?>    

在这之中,属性和方法又可以使用public, protected, private三个不同的关键字来将属性和方法的作用范围做进一步的区分,带有private关键字的属性和方法,只有所在的类中的方法才能调用;带有protected关键字的属性和方法,除了自己以外,自己的父类和子类中的方法也可以调用;带有public关键字的属性和方法,则可以从实例化以后的对象中进行调用,这样做最大的好处给所有的属性和方法增加了一些描述的特征,更便于整理和组织代码的结构。const关键字先跳过,和后面的static一起讲。

static关键字是有别于public, protected, private的另一类型关键字(因此可以和public, protected, private叠加起来使用):

<?php      
class TEST      
{      
    public static function name()       
    {      
        echo 'value';      
    }      
}      
?>

带有static关键字的方法,可以在不对类进行实例化的情况下直接通过“::”符号调用,和public, protected, private的搭配,也可以让调用区分权限,但是一般都是和public搭档,前面提到的常量关键字const,应该就是public static类型的,因此只能通过self::NAME,TEST::NAME这样的形式调用常量,后面的__construct,__destruct等方法,都是属于static。

类的结构部分,最后介绍的两个关键字是abstract和final,abstract关键字表示这个类必须被他的子类覆写,而final关键字表示这个类必须不能被他的子类覆写,这两个关键字的功能是正好相反的,带有abstract的方法被成为抽象方法,带有抽象方法的类,成为抽象类,这个在后面还有介绍。

类的使用:

类的使用主要有两种方法,一种是使用new关键字,另一种是使用“::”符号:

PHP代码 

<?php      
class TEST      
{      
    public static function name()       
    {      
        echo 'value';      
    }      
}      
//方法1:使用new关键字      
$test = new TEST;      
$test->name();      //方法2:使用“::”符号      
TEST::name();      
?> 
  

(1):使用new关键字成为实例化,上面的$test就是一个通过TEST类实例化而产生的对象,$test->name()称为调用$test对象的name方法。
(2):使用new关键字使用类的时候,可以使用$this来指代类本身。
(3):使用“::”符号的前提是方法必须是带有static关键字的,使用new关键字时,被调用的方法,必须带有public关键字(一个方法如果不带public, protected, private中的任何一个关键字,则默认为public)
(4):同一个类可以通过new关键字被实例成多个不同的对象,但是彼此之间的是隔离的;“::”符号在使用的时候,方法在多次使用之间,是共享的:

PHP代码

<?php      
class TEST1      
{      
    public $name = 0;      
    public function name()       
    {      
        $this->name = $this->name + 1;      
    }      
}      $test1 = new TEST1;      
$test2 = new TEST1;      
$test1->name(); //$name1 == 1      
$test2->name(); //$name1 == 1      
/*--------------------------------------------*/     
class TEST2      
{      
    public static $name = 0;      
    public static function name()       
    {      
        TEST2::$name = TEST2::$name + 1;      
    }      
}      
TEST2::name(); // $name == 1      
TEST2::name(); // $name == 2      
?>    
类的关系:

类与类之间的关系,主要有抽象,接口和继承:

PHP代码 

<?php      
abstract class TEST1 // 抽象      
{      
    abstract public function name1();      
    public function name2()      
    {          }      
}      
class TEST2 extends TEST1 implements TEST3 // 继承      
{      
    public function name1()      
    {      
    }      
}      
interface TEST3 // 接口      
{      
    public function name2();      
}      
?>   

(1)带有abstract关键字的类是抽象类,带有abstract关键字的方法是抽象方法,抽象类中的抽象方法,必须在子类中被覆写。
(2)带有interface关键字的类,就是接口,接口不允许实现任何的方法,接口中所有的方法,都必须在子类中被覆写。
(3)带有 classA extends classB 或者 classA implements classB 字样的就是继承,extends表示继承另一个类,implements表示继承另一个接口,一次只能extends一个类,但是可以implements多个接口。
(4)抽象类,接口,以及最终继承并实现的方法,都必须是public的。

在继承的过程中,子类会覆写父类的同名方法,这个时候如果需要在子类中调用父类的方法,可以使用parent关键字或者类名加上“::”符号调用:

PHP代码 

<?php      
class TEST1 extends TEST2      
{      
    public function name()      
    {      
        echo parent::name2();      
        echo TEST2::name2();      
    }      
}      
class TEST2      
{      
    public function name2()      
    {      
        echo 'value2';      
    }      
}      
$test = new TEST1;      
$test->name();      
?>  
 

这里再解释一下“::”方法在类中的作用,一个作用是在没有实例化的情况下调用常量(其实也理解成static就可以了),static属性和方法,再一个是在类的内部,通过self,parent和类名建立便捷的调用通道。

对象于对象之间的关系,主要是“==”等于,“===”全等于,不等于和clone:

PHP代码
<?php    
class TEST    
{    
    public function name()    
    {    

    }    
}    

$test1 = new TEST;    
$test2 = new TEST;    
$test3 = $test1;    
echo $test1 == $test2 ? true : false; // true    
echo $test1 == $test3 ? true : false; // true    
echo $test2 == $test3 ? true : false; // true    
echo $test1 === $test2 ? true : false; // false    
echo $test1 === $test3 ? true : false; // true    
echo $test2 === $test3 ? true : false; // false    
?>   

(1)两个类只要拥有相同的属性和方法,就是“==”等于。
(2)两个类必须是指向的同一个对象,才能是“===”全等于。

clone比较特殊,在上面的例子中,$test3 = $test1的过程并不是给了 $test3 一份 $test1 对象的拷贝,而是让 $test3 指向了 $test1,如果一定要获得一份$test1的拷贝,就必须使用clone关键字:

PHP代码

<?php      
$test3 = clone $test1;      
?>    

类的钩子:

__autoload:
是一个函数名,也是唯一一个在类的外部使用的钩子,在实例化一个对象的时候,如果没有预先载入类,就会调用这个钩子。

__construct
在类被实例话的时候,被调用的钩子,可以做一些初始化的操作。

__destruct
在类被销毁的时候,被调用的钩子。

__call
当对象试图调用一个不存在的方法的时候,被调用的钩子

__sleep
当使用serialize()函数对一个类进行序列话操作的时候,会调用这个钩子

__wakeup
当使用unserialize()函数对一个类进行反序列话操作的时候,会调用这个钩子

__toString
当一个对象将被转变为字符串的时候,会调用这个钩子(比如echo的时候)

__set_state
当调用var_export()函数操作一个类的时候,会调用这个钩子

__clone
当使用clone关键字对一个类进行拷贝操作的时候,会调用这个钩子

__get
在获取一个类中的属性值的时候,会调用这个钩子

__set
在设置一个类中的属性值的时候,会调用这个钩子

__isset
在使用isset()函数对类中的属性值进行判定的时候,会调用这个钩子

__unset
在使用unset()函数销毁一个属性值的时候,会调用这个钩子

类的小技巧:

在实例话一个类的时候,可以使用这样的形式给__construct钩子传递参数:

PHP代码 

<?php      
class TEST      
{      
    public function __construct($para)      
    {      
        echo $para;      
    }      
}      $test = new TEST('value'); // 显示 value      
?>   

foreach()函数可以用来对类或者对象中的属性进行遍历,遍历的时候会先判断public, protected, private的情况而显示:

PHP代码

<?php      
class TEST      
{      
    public $property1 = 'value1';      
    public $property2 = 'value2';      
    public $property3 = 'value3';          public function name()      
    {      
        foreach($this as $key => $value)      
        {      
            print "$key => $value\n";      
        }      
    }      
}      
$test = new TEST;      
foreach($test as $key => $value)      
{      
    print "$key => $value\n";      
}      
$test->name();      
?>    

在给类中的方法传递参数的时候,可以对参数进行强制的判定,这里只支持对数组和对象的判定:

PHP代码

<?php      
class TEST1      
{      
    public function name( TEST2 $para )      
    {          }      
}      
class TEST2      
{      
}      
$test2 = new TEST2;      
$test1 = new TEST1;      
$test1->name('value'); // 会报错,因为这个参数必须是TEST2实例化以后的对象      
$test1->name($test1); // 不会报错      
?>    

兼容php4的语法:

php5的类是往下兼容php4的,这些php4时代的语法也得到了继承,但是并不建议在php5的环境中使用。

(1)使用var预设属性,会自动转换成public。

(2)使用类名作为构造函数,在没有__construct构造方法的情况下,会寻找和类名相同的函数作为构造函数。

PHP 相关文章推荐
用PHP实现登陆验证码(类似条行码状)
Oct 09 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
重新封装zend_soap实现http连接安全认证的php代码
Jan 12 PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 PHP
php向js函数传参的几种方法
Aug 10 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
使用php转义输出HTML到JavaScript
Mar 27 PHP
php如何获取文件的扩展名
Oct 28 PHP
如何正确配置Nginx + PHP
Jul 15 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
php一些公用函数的集合
Mar 27 #PHP
PHP之变量、常量学习笔记
Mar 27 #PHP
php日历[测试通过]
Mar 27 #PHP
PHP与MySQL开发中页面乱码的产生与解决
Mar 27 #PHP
php中cookie的作用域
Mar 27 #PHP
简单的PHP图片上传程序
Mar 27 #PHP
php中变量及部分适用方法
Mar 27 #PHP
You might like
十天学会php之第八天
2006/10/09 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
js代码实现微博导航栏
2015/07/30 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
JS 文件大小判断的实现代码
2010/04/07 Javascript
jquery 笔记 事件
2011/11/02 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
javascript基础知识
2016/06/07 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
在Python中操作字典之update()方法的使用
2015/05/22 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
Numpy掩码式数组详解
2018/04/17 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
python实现ip地址的包含关系判断
2020/02/07 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
技术总监的工作职责
2013/11/13 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python