1.达标和检测
学习PHP的面向对象,你需要具备PHP面向过程的相关基础,如不会,请先学习PHP基础部分.
面向对象一种编程思想,已经几十年了,而PHP这门语言到4.0版本的时候才有了面向对象,所以对于没有任何计算机语言的童鞋来讲,可能瞬间掌握,难度比较大,需要体会和实践,慢慢领悟,为了防止陷入思想的无底洞,先不要管为什么这么写,前期我们需要做的,就是熟悉并熟练操作PHP面向对象的基本语法和用法,随着代码量的增多,理解自然会深化,前期一定要做到如下几点:
**1. 类声明语法 试声明student类,有score属性和study方法
- 权限封装 知道public、 protected、 private各自的可见范围
- 继承 写A类,再写B类继承自A类,且要重写A类中的某个方法
- 静态属性与静态方法, 知道static静态方法需要用类名::方法名()调用
- 魔术方法 了解常用魔术方法分别在什么时间被调用
- 写一个抽象类,并用2个子类分别继承实现 分析这2个子类有什么共同特点?
- 写一个接口,并用2个类分别继承实现 分析这2个类有什么共同点?**
能做出这7题,面向对象就能通过并入门了.
2.第一个类
原来我们在学PHP基础的时候,函数是这样写的.
//函数的声明
function fly(){
echo "爱需要理由吗?";
}
//函数的调用
fly();
如何改成类?
class 类名{
}
//class是固定写法,后面加类名(类名使用大驼峰命名法),紧跟着直接写大括号,然后把函数直接复制进去就偶了.
class Ai{
function fly(){
echo "爱一个人需要理由吗?";
}
}
但是我们怎么样调用呢?如果你直接用函数调用的方法( fly(); )去调用,会直接报错.说找不到函数
说明:类是需要先new后,再调用的,也叫实例化.想一下,什么叫实例化?但从字面意思理解,实例就是现实的例子.翻译成成中文就是,现实的例子化.
也就是说,我想调用fly()这个类中的"函数",需要new Ai();
翻译的通俗像人话一点:就是新建一个现实的例子.
这个时候它会有一个返回值,这个返回值就是大名鼎鼎的"对象".
完整代码如下:
class Ai{
function fly(){
echo "爱一个人需要理由吗?";
}
}
//实例化一个Ai类,返回值是一个对象,储存在$aiai变量里
$ai = new Ai();
3.类的属性和方法
更加通俗一点讲什么是类?这就需要大家去思考现实的东西了.比如说,我们人类,也是一大类,猪类,狗类,自行车类....发现这些都是一大类,并且有共同的特征,有共同的一些东西.
比如:我们人类,你有没有姓名,年龄,性别,身高,体重等等?这些都是我们人类生下来就固有的属性,这在面向对象的思想中叫类的属性.
比如,一个正常人,会不会哭,笑,跑,走,生气这些动作?这在面向对象思想中叫类的方法.
类:说白了就是一整个大类,跟现实中的类一样,通过属性(php面向过程中的变量/名词)和方法(php面向过程中的函数/动作),模拟人或者物的共同特点.
//这是php面向过程的变量声明
$name = '老王';
class{
function fly(){
echo '爱一个人需要理由吗?';
}
}
//实例化一个Ai类,返回值是一个对象,储存在$aiai变量里
$ai = new Ai();
放在里面就成了属性
class{
//类的属性(也可以叫变量)
$name = '老王';
//类的方法(也可以叫函数)
function fly(){
echo '爱一个人需要理由吗?';
}
}
//实例化一个Ai类,返回值是一个对象,储存在$aiai变量里
$ai = new Ai();
怎么样调用?
class{
$name = '老王';
function fly(){
echo '爱一个人需要理由吗?';
}
}
//实例化一个Ai类,返回值是一个对象,储存在$aiai变量里
$ai = new Ai();
$ai->name;
$ai->fly();
发现还是报错,是因为类有权限控制,需要写public,现在可能还不理解权限控制.我们后期的教程中会涉及.先照写就好
class{
public $name = '老王';
function fly(){
echo '爱一个人需要理由吗?';
}
}
//实例化一个Ai类,返回值是一个对象,储存在$aiai变量里
$ai = new Ai();
$ai->name;
$ai->fly();
说明:php5以后,方法默认不用加public也可以调用和执行,因为默认就是public,但之前的版本必须要加public才可以,要不会报语法错误
4.类的语法
我们看一下类的语法注意点
//类名,不区分大小写 习惯上市大驼峰
class Stu{
//属性名 调用时不加$
public $sn = '00001';
public $name = 'lisi';
//方法名
function ks(){
echo '我叫lisi,我来学PHP';
}
}
//类名,不区分大写小,但是我们的编程过程中,要人为的区分
$stu = new stu();
echo $stu->sn,'<br />'; //调用属性.注意:此处一定不能加$符号
$stu->ks();//调用方法
5.类中属性不能是表达式?
php5.6之前,类名只能是直接传值或者常量,而不能是表达式的结果
函数调用,运算等等
PHP5.6以后允许使用包含数组,字符串字面值和常量的标量表达式(数学运算,比较运算等)
高中数学知识:标量和矢量.....(回忆:标量有大小,无方向,标量无方向)
class Stu{
//public $num = rand(10,100);//报错
//public $num = 1+2; //没问题,5.6之前不行
//public $num = array('a','b'=>array('1'));
public $num = 1||0;
}
$stu = new Stu();
echo $stu->num;