今天小编带来的是面向对象类编程的灵魂 类和对象
我们所说的类就是对事物的一个概括描述,比如人类,学生,老师,杯子等,我们不能只通过这样简单的概括去找到那个人活着物品。
在类中最重要的自然是属性和方法,当然还有接口放在继承那段去讲解
定义一个类:class{ 属性,方法和接口 }
属性:类的静态特性,比如姓名,年龄;
在PHP使用这样的方法在类中定义属性:var $name; var $age;(在封装后不用var了)
方法:类的动态特性,比如能说话,能走路;
这样定义方法 :function say(){}; function walk(){}
对象:对类的实例化,比如 那个穿蓝衣服和白裤子170cm 名字叫TOM的站在楼下的孩子,这样我们可以一下子找到那个人或者物品。
我们这样实例化对象:
先创建一个新类
class Person{
//属性
var $name;
var $age;
var $sex;
//方法
function walk(){
echo "走起";
}
function eat(){
echo "吃饭";
}
function say(){
echo "你好";
}
}
接下来实例化一个对象:
$P1=new Person();
$P1->name='张三';//给类内的属性赋值
echo $P1->name;// ->调用类内的属性
$P1->age=18;
echo $P1->age;
$P1->sex='man';
echo $P1->sex;
$P1->walk();
$P1->eat();//调用方法
$P1->say();//调用方法
提到类和对象不得不提及三大特性,封装、继承、多态
1.
首先先来说封装性:上文所创建的类内的属性和方法在类外均可以直接调用并随意改变值,这对于网站的建设来说是非常不安全的,使得人人都可以修改已经规定的类内的值。
所以我们使用PHP的封装性来解决这些问题。
我们先对属性定义:private $name;这样再使用上文的方法发现不能够正常访问属性,怎么办呢,我们有两种方法解决
第一种:
类内定义方法: function setName($name){ $this->name=$name }和 function getName($name) {return $this->name}
同时在类外调用者两个方法:
$C1=new Person();
$C1->setName('Tom');
echo $C1->getName();
第二种:
首先讲下针对一次赋值多个参数的方法: function __construct($name,$age,$sex) {$this->name=$name,$this->age=$age,$this->sex=$sex}
在类外调用
$C1=new Person(‘TOM’,'20','MAN');
echo $B->name;
echo $B->age;
echo $B->name;
发现报错。。。。 原因是并没有写出口方法
接下来我们在类内定义方法:
function __set($propertyName,$propertyValue){
$this->$propertyName=$propertyValue;//对属性再次赋值的时候可使用
}
function __get($propertyName){
return $this->$propertyName;
这样这个类就变成了可读可写的了,通过这两个函数的组合可以做出权限不同的类。
关于类中的常量可以这样定义:const PI=3.14;
想在不同的对象中调用一个相同的属性可以这样定义:
static $color='yellow';//对象公用的量,必须有初值
function same(){
return self::$color;
}
之后在类外调用这个same()方法即可;
上述那个属性直接吧我们引入到了继承性的讨论当中
何为继承:我们把人类作为最大最模糊的类,那么医生,教师,警察,渗透测试工程师,就是比人类划分更仔细的子类,子类含有父类的所有属性和方法(父类当然也可以不允许子类继承自己的属性和方法),同时也有着自己特有的属性和方法。
实现一个子类的继承:
class Person{
protected $name;
protected $age;
protected $sex;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
function say(){
echo "speaking";
}
function eat(){
echo $this->name."eating";
}
}
class Student extends Person{
protected school
function study(){
echo "studying";
}
//对象实例化
$s=new Student();
echo $s->name;
echo $s->age;
echo $s ->sex;
echo $s->school="清华大学";
$s->say();
$s->eat();
$s->study();
关于继承不得不提属性和方法的定义方法:
private $name/function(){} :私有的,此方法和属性只能够在本类使用,不允许子类继承它。
protected $name/function{}:受保护的,本类和子类均可以使用 在实际开发过程中较多使用。
public $name/function{}:共公有的 :本类,子类,孙类,类外均可以使用(使用大忌)。
在弄清楚上述三种定义方法的正确使用后,我们讨论一下方法的重写问题
当我们在父类中允许自己的方法继承后,在子类中可以重新定义名字相同的方法,使其在类外调用后实现不同的功能。
在这个过程要小心,如果类被定义成这样class final Person{},强制子类不能继承这个父类;同理在父类的方法前加 final也不能使子类继承和重写这个方法。
接下来说一下抽象和接口的问题
抽象类:
当我们这样定义一个类时候它就成为了抽象类:这样的类不能被实例化,只能被继承,当中只能写方法不能写任何属性。
abstract class Person{
function eat(){
echo "eat";
}
抽象方法:
我们在父类中这样定义一个方法:abstract function say(); 同时这个方法必须在子类中重写,所以在父类中可以不写方法的内容。
接口:
接口不能在里边写具体的方法和实例化,只能拿来继承
interface inf{
protected $name; //不能包含属性
function say();
function eat();
}
我们这样继承接口:
class Person implements inf,inf1,inf2 { //类实现多个接口,但是不提供多继承
function say(){
echo "say good bye";//继承
}
function eat(){
echo "eat apple";
}
之后在类外直接调用即可。关于继承先说到这里
3.
子类继承父类的属性和方法体现了PHP继承性,而不同对象的不同方法和属性体现了其多态性。
我们先定义一个父类:
class Person{
function say(){
echo "person";
}
}
class Student extends Person{
function stu(){
echo "stu";
}
}
class Teacher extends Person{
function tea(){
echo "tea";
}
}
$p1=new Person();
$s1=new Student();
$t1=new Teacher();
下面判断对象是否是类的实例
if ($p1 instanceof Person){
echo "YES";
}else {
echo "NO";
}
最后我们把父类指针指向地址:
function fun(Person $obj){
$obj->stu();//父累指针指向子类地址,多用于参数。
}
fun($p1); 这样可以由父类的属性调用子类的方法:
未完待续.........