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 相关文章推荐
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
关于IIS php调用com组件的权限问题
Jan 11 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
ucenter通信原理分析
Jan 09 PHP
php实现encode64编码类实例
Mar 24 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
PHP导出Excel实例讲解
Jan 24 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
php实现微信支付之企业付款
May 30 PHP
Laravel框架实现的批量删除功能示例
Jan 16 PHP
laravel 修改.htaccess文件 重定向public的解决方法
Oct 12 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如何实现验证码
2016/01/20 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
js活用事件触发对象动作
2008/08/10 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python里运用私有属性和方法总结
2019/07/08 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
群众路线教育实践活动剖析材料
2014/09/30 职场文书
2014年新教师工作总结
2014/11/08 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS