面相对象
面向对象程序设计简称OOP(Object-oriented programming)。是一种类型的抽象,或者说是一种类型以编码的方式进行描述。概念上理解并不能直观的说明问题,以下将会有示例为读者直观的感受面向对象。
类代表一个类别,例如人、车子、动物、液体都属于一个类,在php中我们用class表示一个类。 对象指这一个类的实例化,例如人这一个类,有一个具体,如小明是一个人类,小明就是这一个类别的具体;动物也是一个类,对象可以为猴子,猩猩,马等;液体也是一个类,水属于液体这一个类别,牛奶也属于液体这一个类别。 成员函数一般指这一个类中的一些属性,例如人这个类别,有年龄、身高、性别、头发等这一些属性;液体有颜色、密度等属性。 子类指一个父类的派生,也就是人这一个类属于动物,动物这一个类别就是人类的父类,人类这一个类别指动物的子类。 父类是一个类的父亲,以上以说明。 类方法可以指类里面的一些接口动作,例如人可以吃饭、人可以走路等。
一个最为简单的面向对象示例
接下来看一下一个简单的类定义:
代码语言:javascript复制<?php
class Human {
public $sex;
public $hair;
}
?>
以上使用class 这个关键字定义了一个Human类,Human是一个类的名称,就跟函数名称一样可以自己设置,Human的意思为人,这里定义的是一个人的类别。人的属性有名字和年龄,在类名后的花括号中,编写了 public sex; 与 public hair;方法,public 是对变量以及方法的修饰,表示这个变量或者方法是公开的。就像你的性别,外人可以从外貌上分表你是男是女,这些属性是公开的,可以使用public进行修饰。除了public方法可以修饰公开的属性或者方法外,还可以使用private 修饰一些私有的方法,例如你的胃消化的方法,只有你自己可以调用,外人是使用不了,这个方法可以使用private进行修饰(当然,这个比喻并不是很好的说明这个问题,接下来将会用示例进行说明)。 以下示例将Human这个类进行实例化:
代码语言:javascript复制$Xiaoming=new Human();
这个时候只是实例化了这个类,$Xiaoming 就是Human这个类的对象。我们可以为这个对象设置值。设置值需要添加一些方法:
代码语言:javascript复制<?php
class Human {
public $sex;
public $hair;
public function set_Sex($val){
$this->sex=$val;
}
public function set_Hair($val){
$this->hair=$val;
}
}
$Xiaoming=new Human();
?>
以上代码中 public function set_Sex 定义了一个函数,函数名为 set_Sex,使用了public进行修饰,表示这个函数可以直接调用;这个函数接收一个参数,参数名为 val。在set_Sex 函数的花括号中,代码为 this->sex=val;,this为当前对象,指当前类,->表示一个指向,this->sex就为当前类中的sex成员属性(变量),赋值为传入的
代码语言:javascript复制<?php
class Human {
public $sex;
public $hair;
public function set_Sex($val){
$this->sex=$val;
}
public function set_Hair($val){
$this->hair=$val;
}
}
$Xiaoming=new Human();
$Xiaoming->set_Sex('nan');
$Xiaoming->set_Hair('y');
?>
以上代码中使用对象 Xiaoming 用箭头-> 运算符调用 set_Sex 函数,并且传入了一个值为 nan(男女的拼音):
代码语言:javascript复制<?php
class Human {
public $sex;
public $hair;
public function set_Sex($val){
$this->sex=$val;
}
public function set_Hair($val){
$this->hair=$val;
}
public function get_Sex(){
return $this->sex;
}
public function get_Hair(){
return $this->hair;
}
}
$Xiaoming=new Human();
$Xiaoming->set_Sex('nan');
$Xiaoming->set_Hair('y');
echo $Xiaoming->get_Sex();
echo ' ';
echo $Xiaoming->get_Hair();
?>
以上代码中,使用 get_Sex() 方法获取性别,使用 get_Hair 获取是否有头发。在函数内使用return 返回了 this->sex 的值。
private
我们可以在类中修改 set_Sex 的修饰public 为 private,使用 private 后外部调用将会报错:
代码语言:javascript复制<?php
class Human {
public $sex;
public $hair;
private function set_Sex($val){
$this->sex=$val;
}
public function set_Hair($val){
$this->hair=$val;
}
public function get_Sex(){
return $this->sex;
}
public function get_Hair(){
return $this->hair;
}
}
$Xiaoming=new Human();
$Xiaoming->set_Sex('nan');
$Xiaoming->set_Hair('y');
echo $Xiaoming->get_Sex();
echo ' ';
echo $Xiaoming->get_Hair();
?>
运行报错如下:
但是在类内部中是可以调用的,在以下示例中,新建了一个 printInfo 函数,使用private 进行修饰,在外部调用不了,但是在内部还是可以调用的:修改一下查看示例:
代码语言:javascript复制<?php
class Human {
public $sex;
public $hair;
private function printInfo($val){
echo '传入的值是 '.$val.'<br/>';
}
public function set_Sex($val){
$this->printInfo($val);
$this->sex=$val;
}
public function set_Hair($val){
$this->hair=$val;
}
public function get_Sex(){
return $this->sex;
}
public function get_Hair(){
return $this->hair;
}
}
$Xiaoming=new Human();
$Xiaoming->set_Sex('nan');
$Xiaoming->set_Hair('y');
echo $Xiaoming->get_Sex();
echo ' ';
echo $Xiaoming->get_Hair();
?>
在 printInfo 函数中,传入了一个 val 参数,随后输出了这个参数。 printInfo 方法调用在 set_Sex 方法中,传入了 val,用 printInfo 作为提示。 结果如下: