类的结构: 类的内部能可能有三种东西,就是常量(constant),属性(property)和方法(method),功能可以理解成类外部的常量,变量和函数。
 
 
复制代码代码如下:
<?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构造方法的情况下,会寻找和类名相同的函数作为构造函数。

(转)php5中类的学习的更多相关文章

  1. PHP5新语法学习

    Final标记方法,使其不能被子类重载:Final标记类,使其不能被继承. 连续引用返回的对象$obj->method()->method2(); __autoload()使用未定义的类的 ...

  2. PHP第一章学习——了解PHP(下)

    继续昨天的部分! —————————————————————————————— 首先Ubuntu下安装Apache软件: ubuntu更新源有问题,又要解决半天! 我现在很冷静! 安装Apache教程 ...

  3. 【PHP】PHP中的类与对象

    面向对象并不是PHP的关键,但PHP确实能很好的支持面向对象编程,而且类与对象也成为了PHP5的核心组成部分.PHP的面向对象特性让构建大型的复制应用成为可能,有了类与对象,就自然产生了各种编程范式和 ...

  4. 《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)

    学习地址为: http://www.yiibook.com/book/agile_web_application_development_with_yii1.1_and_php5   1.建立应用程序 ...

  5. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...

  6. coffeeScript中类的继承[学习篇]

    只是在看深入浅出coffeescript中感觉真的很好,不光是coffe写法简单,生成的js也值得学习,废话不多说了,直接抄个书上的例子 class Pet constructor: -> @i ...

  7. php5.4 trait 理解与学习

    Trait 是 php5.4引入的新特性,手册上说的一大段没看懂,这里直接来过来. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员 ...

  8. PHP7 学习笔记(二)PHP5.9 升级到PHP7 遇到的一些坑的记录(php-fpm 图解)

    apache_event_php-fpm 示意图: nginx-php-fpm示意图: Worker-Master-Server TCP-Nginx_PHP Nginx-FastCGI 1.使用$_G ...

  9. 【Thinkphp学习】TP3.2.3在PHP5.5环境下运行非常慢

    在做项目时遇到了一个瓶颈问题:老项目迁移到PHP5.5环境后打开网页很卡很慢. 服务器环境为:apache+php5.5.38+mysql,使用框架为Thinkphp3.2.3. 经过多方面排查找到了 ...

随机推荐

  1. 求助:对话框下OnInitDialog中使用SetTimer无效

    原文地址:http://www.w3c.com.cn/%E6%B1%82%E5%8A%A9%EF%BC%9A%E5%AF%B9%E8%AF%9D%E6%A1%86%E4%B8%8Boninitdial ...

  2. BZOJ 1009 GT考试

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  3. UBUNTU下FPT工具--lftp使用说明

    lftp 是UBUNTU下一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps 和https需要在编译的时候包含open ...

  4. java面向对象值类属语句块

    在我们之前学习语句的时候,我们讲过一种比较特殊的语句块,那就是局部代码块.局部代码块的作用是什么呢,就是把临时使用的变量放在里面,之后执行完之后,局部代码块中定义的变量会直接被释放,这样就避免了那些我 ...

  5. VIM default configuration

    == Vim的行号.语法显示等设置(.vimrc文件的配置) ==2008年01月18日 星期五 23:01 在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能 ...

  6. 【模拟】ECNA 2015 I What's on the Grille? (Codeforces GYM 100825)

    题目链接: http://codeforces.com/gym/100825 题目大意: 栅栏密码.给定N(N<=10),密钥为一个N*N的矩阵,'.'代表空格可以看到,'X'代表被遮挡,还有密 ...

  7. 关于cocos2d这个东西

    我是在今年6月份左右接触到cocos2d这个东西的,当时就是想写个小游戏,结果买书的时候误打误撞就买了cocos2d的书. cocos2d是一个开源的游戏引擎,用于构建2d游戏,同时也可以用它写各种图 ...

  8. 从cpu加电到加载OS内核的详细过程(清华大学ucore-lab1总结一)

    结合最近学习清华的OS课,先用“人话”来高度抽象的描述一下我自己的理解.CPU在系统加电也就是我们按下电源开关后,开始初始化他的寄存器,主要是cs和eip(本文基于x86架构),然后在ROM中找到一个 ...

  9. poj 2187 凸包加旋转卡壳算法

    题目链接:http://poj.org/problem?id=2187 旋转卡壳算法:http://www.cppblog.com/staryjy/archive/2009/11/19/101412. ...

  10. python最简洁的条件判断语句写法

    这篇文章主要介绍了Python返回真假值(True or False)小技巧,本文探讨的是最简洁的条件判断语句写法,本文给出了两种简洁写法,需要的朋友可以参考下 如下一段代码: def isLen(s ...