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
smarty 原来也不过如此~~呵呵
Nov 25 PHP
php随机输出名人名言的代码
Oct 07 PHP
php与flash as3 socket通信传送文件实现代码
Aug 16 PHP
PHP生成条形图的方法
Dec 10 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
php网页版聊天软件实现代码
Aug 12 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 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 session有效期问题
2009/04/26 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
详解js异步文件加载器
2016/01/24 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
详解jQuery中的easyui
2018/09/02 jQuery
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
详解Python中的Cookie模块使用
2015/07/06 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python安装scipy的方法步骤
2019/06/26 Python
python global关键字的用法详解
2019/09/05 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
人力资源管理毕业生自荐信
2014/06/26 职场文书
工伤事故证明
2014/10/20 职场文书
药店营业员岗位职责
2015/04/14 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书