1.1面向对象的基本概念
在编程中,我们如果要采用面向对象的编程思想来编程的话首先我们必须明确的就是对象以及对象之间的关系。
对象都有自己的属性与方法,属性就是对象的一些特性,方法就是对象行为。在PHP编程的角度,属性就是变量,方法就是函数。在面向对象中最基本的概念有:
Ø 抽象数据类型和数据封装
Ø 继承
Ø 多态
在实际的开发中,有些类与其他类拥有相同的变量和函数。这时,可以定义一个通用的类,包含了所有的变量和函数。
1.2PHP中类与对象
从数据类型的角度来看,对象是一种比较特殊的数据类型。它是由一个事先定义好的类生成的。而类是由用户自己定义的。它一定会包含一些属性与方法。也就是说类是用户自定义的数据类型。
$a_man = new person; |
上述代码中,person是一个类,而这个类是用户自己定义的,$a_man表示的是person类型的一个变量。也就是说$a_man就是person的一个对象。
类也是一种数据类型,要创建一个类类型的对象必须通过关键字new。也就是说new 在这里也是一种运算符。
1.2.1类的创建
语法:
class 类名{
}
解释:class是php中的关键字,表示类开始定义。类名是你自定义的。{}中间的语句是类的实体,包含了属性与方法。类中数据,一般也叫做成员变量(属性),类中函数一般叫做成员函数(方法)。
例子:
class person{ private $name; private $age; } |
上述代码表示声明了一个类叫做person类,它里面只有两个成员属性,并且这俩个属性都有关键字private限定,意思是该成员变量是私有的,属性不能从类的外部进行访问,也就是说只允许在类的内部进行操作。通常定义一个类就是为了将数据进行封装,这样是为了防止数据在封装之外被修改,而对数据的操作以借口的形式提供给外部的,也就是说,类通过定义类的成员方法,项外部提供操作类的成员变量的接口。
例子:
class person{ private $name;
public function set_name($name){
$this->name = $name;
}
public function get_name(){
echo "user name is :".$this->name; } } |
1.2.2对象的创建——实例化对象
其实类就是一种数据类型的模板,本身并不会惊醒数据处理。要想进行数据处理,在数据处理之前我们必须做一件事,对类进行实例化。类本身是抽象,是对一类事物的抽象描述。
在我们PHP中建立好一个类之后,我们就可以通过new关键字进行实例化类。
class person{ private $name;
public function set_name($name){
$this->name = $name;
}
public function get_name(){
echo "user name is :".$this->name; } }
$a_man = new person;//实例化一个person类,并且把实例化后的对象给了$a_man;
$a_women = new person;
$a_man->set_name("谢翰辉");//调用类中的set_name()成员方法,给对象进行name属性赋值
$a_man->get_name();
echo "<br>";
$a_women->set_name("周玉婷");
$a_women->get_name(); |
1.2.3构造函数和析构函数
构造函数:在一个类中声明一个__construst的函数,就称作构造函数。它的作用是类在实例化的时候被调用。另外一种命名方式:比如你的类名叫做Person类,你完全可以取一个函数名叫做Person()的函数,此时这个Person()函数就是Person类的构造函数。也就是说不同的同的构造函数的函数名出现了不同。
析构函数:在一个类中声明一个__destrust的函数,就称为析构函数。它的作用是类的实例化对象在被销毁的时候调用。
<?php class Person{ private $name;
public function __construct(){ echo "这里是构造函数,据说他是在类被实例化的时候调用的!"; }
public function set_name($name){
$this->name = $name;
}
public function get_name(){ echo "这里是get方法,为了取得用户设置的name:".$this->name; }
public function __destruct(){ echo "这里是析构方法,据说他是在对象被销毁的时候被调用的。";
}
} echo "<br>"; $a = new Person; echo "<br>";
$a->set_name("黄志鹏");
$a->get_name(); echo "<br>"; //$b = new Person;
|
上述我们写的构造函数和析构函数只是为了演示他们作用,其实构造函数的一个很大的作用就是初始化对象的属性。
<?php class Person{ private $name; private $id;
public function __construct($id,$name){
$this->id = $id;
$this->name = $name;
}
public function my_print(){ echo "我的身份证号码是:".$this->id."我的名字叫:".$this->name;
} }
$a = new Person(1289239153283029,"房贺军");
$a->my_print();
|
1.2.4继承
对于面向对象编程,通过继承可以增加或重写类的方法。这就意味着继承类可以指定更多的属性和方法,并且允许继承类访问基类的方法。也就是说继承体现了一个is-a的关系。比如说,我们一直在写的Person,我们现在根据实际需求可不可以写一个Student类,学生是不是人?假如你已经有了Person类,关于学生类你是否还需要继续去写person类中所有的属性,还是让我们的学生类直接继承person类,在person类的基础上扩充属性和方法。Worker类是不是人?工人也是人,但是工人和学生。
例子:
<?php class Person { private $name;
public function set_name($name){
$this->name = $name;
}
public function get_name(){
echo "user name is :".$this->name; } }
class Student extends Person{
private $studentId;
public function set_studentId($studentId){ $this->studentId = $studentId; }
public function get_studentId(){
echo "Student id is :".$this->studentId; }
}
$a_student = new Student;
$a_student->set_name("刘志雄"); $a_student->set_studentId("20141331171");
$a_student->get_name(); $a_student->get_studentId();
|
1.2.5访问对象的属性和方法
一个对象的属性是变量,就像PHP中的其他变量一样,只不过在使用的时候我们必须通过->运算符来引用,但是不需要在属性前面加$。访问方法和访问属性是一样的。如果我们要访问一个继承的属性,只需要像访问基类自己的属性那样引用,使用::运算符。
在PHP中继承的用法中,有两个特殊的命名空间分别是parent和self,parent指向的父类,self指向当前类。
例子:
<?php class Animal{
public $blood;
public $name;
public function __construct($blood,$name=NULL){
$this->blood = $blood; if($name){ $this->name = $name; }
}
}
class Mammal extends Animal{
public $fur_color; public $legs;
function __construct($fur_color, $legs, $name){
parent::__construct("warm", $name); $this->fur_color = $fur_color; $this->legs = $legs;
}
}
class Cat extends Mammal{
function __construct($fur_color, $name){ parent::__construct($fur_color, 4, $name); self::bark(); }
function bark(){ print ("$this->name says,'miao~miao~miao~'"); }
}
$cat_xiaobai = new Cat("white", "xiaobai"); //$cat_xiaobai->bark(); |
1.2.6PHP中类的静态成员
静态成员包含是静态属性和静态方法,类的静态成员与类的一般成员不同,静态成员与类的实例无关,只和类本身有关。也就意味着类的静态成员由该类的所有实例化对象共有。在实际开发中,如果希望在不存在有效对象的时候调用一个方法,那么就可以使用静态方法。
例子:计数器
<?php class Counter{ private static $count = 0;
function __construct(){ echo "<h1>計數器開始!</h1>"; }
function __destruct(){
echo "<h1>計數器結束!</h1>"; }
static function get_count(){ return self::$count; }
static function counts(){ self::$count++; } }
$c = new Counter();
$i = 0;
while ($i <100){ Counter::counts(); $i = Counter::get_count(); echo Counter::get_count()."<br>";
} |
1.2.7PHP中一些和类有关的函数
在PHP中我们成这些和类有关的函数为魔术函数。
Ø __construct():构造方法,当实例化一个对象的时候被调用。
Ø __destruct():析构方法,当一个对象不再使用的时候被调用。
Ø __get():当访问某个类没有显示定义的属性的时候,该方法被调用。
Ø __set():当设置一个不存在的属性的时候,该方法被调用。
Ø __call():当访问一个不存在的方法的时候,该方法被调用。
Ø __toString():将一个对象转化成字符串。
Ø __clone():克隆一个对象时使用。
在PHP中,每一个类都会自动继承__set()和__get()方法,定义如下:
void __set(string $name,mixed $value) mixed __get(String $name) |
当访问当前类没有显式定义的属性时,被访问的属性名称作为参数传入相应的方法。PHP中任何类都可以定义各自的__set()和__get()方法,来实现你自己的功能。
例子:
<?php class Test{ public function __get($prop_name){ echo "獲取屬性:($prop_name)<br>"; } public function __set($prop_name,$value){
echo "設置屬性 $prop_name 的值為 ‘ $value ’ "; } }
$t = new Test(); $t->id; $t->id = "123456";
|
当我们访问一个类中根本就不存在的属性的时候,此时会自动调用__get()方法;比如说:上例中的$t->id;
当你访问一个类中不存在的属性并且为其赋值的时候,此时会自动调用__set()方法,如上例中的$t->id = "123456";
作业:去查阅资料或者百度,分别针对于__call() __toString() __clone()这三个方法举例说明。明天交。
1.3实例分析——深入理解PHP的类和对象
在面向对象编程的思想中,万事万物皆对象,当然一个web页面同样也是一个对象。接下来我们就用PHP来创建一个代表web页面的类,使用该类去生成一个HTML页面。
1、 声明属性,一个web页面就是一个HTML文档,HTML文档应该具有标题和内容,这里再增加一个属性就是HTML文档中的META关键字,使用META关键字有利于搜索引擎搜索到该web页面。所以说就有标题、内容、关键字这些属性,并且都是共有属性,应该使用public关键字来修饰。
public $title; public $content; public $keywords; |
因为每个页面都包含一个导航栏,便于用户访问完整的任意一个栏目,所以还需要声明一个存放导航栏内容的属性,我们把它声明为一个数组:
public $buttons = array( '主页'=>'#', '产品'=>'#', '服务'=>'#', '联系我们'=>'#', '网站地图'=>'#', ); |
2、 定义方法,通过这些方法可以生成Web页面的各个部分,如web页面的头部、关键字、CSS、页面导航、页面的底部等
3、 实现页头部分,一个页头往往主要显示的是网站的logo和网站的名称,在这里我们将logo个网站名称放在一个表格里。在类的方法中使用echo将这个表格输出,从而实现页面头部。
public function DisplayHeader(){ echo "<table width=\"100%\" cellpadding=\"12\" cellspacing=\"0\" border=\"0\" "; echo "<tr>"; echo "<td align = \"left\"><img src=\"Demo1\\img\\logo.jpg\"/></td>"; echo "<td bgcolor = \"#FFFFFF\">"; echo "<h1>网站名称在这里</h1>"; echo "</td>"; echo "<td align=\"right\"></td>"; echo "</tr>"; echo "</table>"; } |
4、 输出关键字,关键字应该meta标签中,所以代码:
public function DisplayKeywords(){ echo "<mata name = \"keywords\" content=\""; echo $this->keywords; echo "\"/>\r\n";
} |
5、 实现显示其他部分的方法。
<?php class Page { // private $title;
// public function set_title($title){ // $this->title = $title; // }
// public function get_title(){ // return $this->title; // }
public $title="音乐唱片大全"; public $content;//Page content. public $keywords="MP3,音乐,唱片,music";//Page keywords.
//Page tabs navigation public $buttons= array( '主页'=>'#', '产品'=>'#', '服务'=>'#', '联系我们'=>'#', '网站地图'=>'#' );
public function DisplayTitle() { echo "<title>"; echo $this->title; echo "</title>\r\n"; }
public function DisplayContent() { echo $this->content; }
public function DisplayKeywords() {
echo "<meta name = \"keywords\" content = \""; echo $this->keywords; echo "\"/>\r\n";
}
public function DisplayPage() { echo "<html>\r\n<head>"; $this->DisplayTitle(); $this->DisplayStyles(); $this->DisplayKeywords(); echo "</head>\r\n<body>";
$this->DisplayHeader(); $this->DisplayMenus($this->buttons); $this->DisplayContent();
$this->DisplayFooter(); echo "</body>\r\n</html>"; }
public function DisplayStyles() { echo "<style>"; echo "h1{color:#000000; font-size:24pt; text-align:center;font-family:arial,sans-serif}"; echo ".menu{color:#256114; font-size:12pt; text-align:center;font-family:arial,sans-serif; font-weight:bold}"; echo "td{background:#EFEFEF}"; echo "p{color:black; font-size:12pt; text-align:justify;font-family:arial,sans-serif}"; echo "p.foot{color:#256114; font-size:9pt; text-align:center;font-family:arial,sans-serif; font-weight:bold}"; echo "a:link,a:visited,a:active{color:#256114}"; echo "</style>"; }
public function DisplayHeader() { echo "<table width=\"100%\" cellpadding =\"12\" cellspacing =\"0\" border =\"0\">"; echo "<tr>"; echo "<td align =\"left\"><img src = \"logo.jpg\" /></td>"; echo "<td bgcolor=\"#FFFFFF\">"; echo " <h1>音乐唱片大全</h1>"; echo "</td>"; echo "<td align =\"right\"></td>"; echo "</tr>"; echo "</table>"; }
public function DisplayMenus($buttons) { if(is_array($buttons) && count($buttons)==0) return; echo "<table width=\"100%\" bgcolor=\"#FFFFFF\" cellpadding=\"4\" cellspacing=\"4\"\n"; echo " <tr>\n";
//calculate button size $width = 100/count($buttons);
while (list($name, $url) = each($buttons)) { $this -> DisplayButton($width, $name, $url, !$this->IsURLCurrentPage($url)); } echo " </tr>\n"; echo "</table>\n"; }
public function IsURLCurrentPage($url) { if(strpos($_SERVER['PHP_SELF'], $url )==false) { return false; } else { return true; } }
public function DisplayButton($width, $name, $url, $active = true) { if ($active) { echo "<td width =\"$width%\" align=\"center\">"; echo "<a href = \"$url\">"; echo "<a href =\" $url \"><span class=\"menu\">$name</span></a></td>"; } else { echo "<td width =\"$width%\">"; echo "<img src =\"side-logo.gif\">"; echo "<span class=\"menu\">$name</span></td>"; } }
public function DisplayFooter() { echo "<table width = \"100%\" bgcolor =\"black\" cellpadding =\"12\" border =\"0\">"; echo "<tr>"; echo "<td>"; echo "<p class=\"foot\">版权所有 © 2016 | Powerd by 湖南安全技术职业学院</p>"; echo "</td>"; echo "</tr>"; echo "</table>"; } }
|
6、 在一个PHP中生成HTML页面
<?php include 'Page.php';
$index = new Page();
$index->content= "<p>在PHP中我们成这些和类有关的函数为魔术函数。<br> __construct():构造方法,当实例化一个对象的时候被调用。<br> __destruct():析构方法,当一个对象不再使用的时候被调用。<br> __get():当访问某个类没有显示定义的属性的时候,该方法被调用。<br> __set():当设置一个不存在的属性的时候,该方法被调用。<br> __call():当访问一个不存在的方法的时候,该方法被调用。<br> __toString():将一个对象转化成字符串。<br> __clone():克隆一个对象时使用。<br>
</p>";
$index->DisplayPage(); |