PHP学生笔记:PHP中的面向对象编程

参考:http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/09/10/1823042.html


1、类的成员变量、成员函数,默认修饰符是public;
2、类的成员函数访问自身的成员函数、成员变量用 $this->name; $this->say();
3、类的成员函数访问父类的成员函数用 parent::__construct($name, $sex, $age);
4、类的构造函数是__construct(),析构函数__destruct()
5、final class Math{ } 表示Math类不可被继承,class Car{ final function stop(){ }} 表示Car的stop()方法不可被子类覆盖。 
6、PHP的成员函数不能被重载(C++中通过“参数的个数“或“参数的类型“不同来实现重载),因为PHP没有名子空间的概念,在同一个页面和被包含的页面中不能定义相同名称的方法, 也不能定义和PHP给我提供的方法的方法重名
7、访问类Foo的static变量xx,类外用Foo::$xx,类里用self::$XX,
8、在PHP中定义常量使用的是“define()”这个函数,但是在类里面定义常量使用的是“const”这个关键字,访问类Foo的常量const xx,类外用Foo::xx,类里用self::XX,注意定义的时候不要public,使用的时候没有$
9、抽象方法、抽象类用abstract来修饰,抽象中可以含有非抽象方法和成员变量,但只要含有一个抽象方法,该类就是抽象类,抽象类不能被直接实例化;
10、接口用interface修饰,接口是一种特殊的抽象类,其所有方法都必须是抽象方法,另外接口里面不能声明变量(但可声明常量constant),而且接口里面所有的成员都是public权限的,一个类只能extends一个父类,还可以implemtns多个接口;
11、serialize()和unserialize()用来实现php的序列化和反序列化,
序列化之前,php会自动调用魔术方法__sleep(),__sleep()函数不接受任何参数, 但返回一个数组,其中包含需要串行化的属性。末被包含的属性将在串行化时被忽略,如果没有__sleep()方法,PHP将保存所有属性。
反序列化之前,php会自动调用__wakeup()。
12、在类里面声明的以“__”开头的方法有特殊含义,__toString(), __get(),__set(),__isset(),__unset(),__construct(),__destruc殊情况下自动调用。
(1)echo一个对象时自动调用 __toString();
(2)读写private属性时自动调用__get(),__set();
(3)isset(),unset()private属性时自动调用__isset(),__unset();
(4)克隆一个对象时调用 __clone()方法,__clone()方法自动包含$this和$that两个参数,$this指向复本,而$that指向原本;
(5)调用一个对象的方法,当这个方法不存在时程序会出错,然后程序退出不再继续执行。那么可不可以在程序调用对象内部 不存在的方法时,提示我们调用的方法及使用的参数不存在,但程序还可以继续执行,这个时候我们就要使用在调用不存在的方法时自动调用的方法“__call()”。
__call()有2个参数,第一个参数为这个不存在的方法的方法名,第二个参数则是把这个方法的多个参数以数组的形式传进来。
13、__autoload() 是专门为 类的不存在 而设计的!!!很多框架利用这个函数,实现 类文件的自动加载 !!!
function __autoload($classname)
{
require_once $classname . '.php';
}



<?php
	header("Content-type: text/html; charset=utf-8"); 
	
	//定义一个"人"类做为父类
	class Person
	{
		//下面是人的成员属性
		var $name; //人的名子
		var $sex; //人的性别
		var $age; //人的年龄

		//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
		function __construct($name, $sex, $age) {
			$this->name = $name;
			$this->sex = $sex;
			$this->age = $age;
		}

		//这个人可以说话的方法, 说出自己的属性
		function say() {
			echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age."<br>";
		}
		
		function __destruct()
		{
			echo "Person【".$this->name."】被析构<br>";
		}
	}

	class Student extends Person
	{
		//学生的最大学号
		static $No = 0;
		const slogan = "好好学习,天天向上!";
		
		var $myNo;
		var $school; //学生所在学校的属性

		function __construct($name, $sex, $age, $school) {
			//使用父类中的方法为原有的属性赋值
			parent::__construct($name, $sex, $age);
			$this->school = $school;
			$this->myNo = ++self::$No;
		}

	
		//这个学生学习的方法
		function study() {
			echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习<br>";
		}

		//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
		function say() {
			parent::say();
			echo "我在" . $this->school . "上学,我的学号是" . $this->myNo . "<br>";
		}
		
		function __destruct()
		{
			echo "Student【".$this->name."】被析构<br>";
		}
	}
	
	$person = new Person("小明", "女", 15);
	$person->say();
	echo "<br>";
	
	$stu1 = new Student("张三", "男", 20, "实验小学");
	$stu1->say();
	echo "<br>";
	
	$stu2 = new Student("李四", "女", 18, "XX小学");
	$stu2->study();
	echo "<br>";
	
	echo "当前学生的最大学号:".Student::$No;
	echo "<br>";	
	echo "学习的口号是:".Student::slogan;
	echo "<br>";
?>

输出结果:

我的名字叫:小明 性别:女 我的年龄是:15

我的名字叫:张三 性别:男 我的年龄是:20
我在实验小学上学,我的学号是1

我的名子叫:李四 我正在XX小学 学习

当前学生的最大学号:2
学习的口号是:好好学习,天天向上!
Student【李四】被析构
Student【张三】被析构
Person【小明】被析构



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值