首页 > 代码库 > PHP课程笔记8
PHP课程笔记8
课时154 PHP类的访问类型控制
1.子类用extends 来继承,
2.private 只能自己使用,自己的子类都不行
3.protected 保护权限,可以是自己和自己的子类使用,其他的不行.
课时155 PHP继承中的重载(覆盖)
对象 -> 成员
类 :: 成员
parent::成员 使用此来调用父类中被覆盖的方法
重要: 只要是子类的构造方法,去覆盖父类的构造方法,一定要在子类的最上面调用一次父类的构造方法.
权限问题: 子类只能大于或等于父类的权限.
课时156 PHP常见的关键字
final 可以修饰类 ---这个类不能有子类,不让扩展
final 可以修饰方法 ---这个方法就能在子类中覆盖
final 不可以修饰成员属性
课时157 static关键字的使用1
static 可以可以修饰属性和方法,但不能修饰类
它修饰的成员方法,可以存在内存的初始化静态段.
可以被所有同一个类的对象共用.
1.第一次用到这个类时,类加载到内存中,就已经将静态成员加到了内存里
课时158 static关键字的使用2
1.static修饰的成员也可以修改值
2.self可以在类中的方法中,代表自己类的($this)
self::$bianliang
3.静态成员一旦被加载,只有在脚本结束后才释放
4.静态方法可以在不经过创建对象就直接使用
5.在静态的方法中,是不能访问非静态的成员的,
6.只要是能使用静态的环境下声明方法,最好使用静态方法,主要是考虑到效率
课时159 单态(单例、单件)设计模式
<?php
/*
* 一个类只能有一个对象存在
* 单态(单例)设计模式 -- 最适合PHP使用这个设计模式
*
* 1.如果想让一个类,只能有一个对象,就要先让这个类不能创建对象.将构造方法私有化(private)
* 2.可以在类的内存中使用一个静态方法,来创建对象方法
*/
class Person {
static $obj = null;
private function __construct(){
}
static function getobj(){
//如果第一次调用时没有对象,则创建,以后调用时,直接使用第一次创建的对象.
if(is_null(self::$obj)){
self::$obj = new self;
}
return self::$obj;
}
function say(){
echo "hahahahahahah<br>";
}
function __destruct(){
echo "#######<br>";
}
}
$p = Person::getobj();
$p -> say();
$p = person::getobj();
$p = person::getobj();
?>
结果:
hahahahahahah
#######
课时160 const关键字
<?php
/*
*
* define("常量名","值")
* 不能在类里用define定义常量
*
* const修饰的成员属性为常量,也只能修饰成员属性
* final 修饰类和方法
* static 修饰属性和方法
*
* 1.常量建议使用大写,不能使用$
* 2.常量一定要在申明时就给好初值
* 3.常量的访问方式和静态的访问方式一样,但只能读
* a.在类外部使用 类::常量名
* b.在类的内部使用 self::常量名
* 4.
*
*/
define("ROOT","/user/local/lib/");
class Demo{
public $name;
//define(); 不能使用
const SEX="男";
static function say(){
echo "<br>我的性别是".self::SEX."性<br>";
}
}
echo Demo::SEX;
Demo::say();
?>
结果:
男
我的性别是男性
课时161 魔术方法__toString()
<?php
/*
* __construct()
* __destruct()
* __set()
* __get()
* __isset()
* __unset()
*
* 特点
* 1.自动调用,但不同的魔术方法有自己的调用时机
* 2.都是以"__"(双下划线)开头的方法
* 3.所有的魔术方法名都是固定的
* 4.如果不写,就不存在,也就没有默认的功能
*
* __toString()
* 1.是在直接使用 echo print printf输出一个对象引用时,自动调用这个方法
* 2.将对象的基本信息放在__toString()方法内部,形成字符串返回
* 3.__toString()方法中不能有参数,而且必须返回一个字符串
*/
class Person{
public $name;
public $age;
public $sex;
function __construct($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
function say(){
}
function __toString(){
$a = "这样可以?";
$b = "设置变量再返回";
return $b.$a;
}
}
$p = new Person("六六",12,"女");
echo $p;
?>
结果:
设置变量再返回这样可以?
课时162 魔术方法__clone()
<?php
/*
* 1.使用clone这个关键字克隆对象,内存中会存在两个对象
*
* __clone()魔术方法
* 1.在克隆对象时,自动调用该方法
* 2.作用:和构造方法一样,是对新克隆的对象进行初始化
* 3.在这个方法中$this代表的是副本,所以就可以给所有的副本成员初始化
*/
class Person{
public $name;
public $age;
public $sex;
function __construct($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
function say(){
echo "我的名字是{$this->name}<br>";
}
function __toString(){
return "aaa";
}
function __destruct(){
echo "123<br>";
}
function __clone(){
echo "我是克隆的:";
$this->name = "zaj";
}
}
$p = new Person("sce",13,"man");
$p -> say();
$p2 = clone $p;
$p2 -> say();
?>
结果:
我的名字是sce
我是克隆的:我的名字是zaj
123
123
课时163 魔术方法__call()
<?php
/*
* 通过__call()处理错误调用
*
* __call()
* 1.就是在调用一个对象中不存在的方法时,自动调用的方法
* 2.有两个参数: 第一个参数,调用的不存在的方法的方法名,第二个参数,是调用这个不存在的方法的方法参数
* 3.可以把功能比较相似的方法合成一个去写
* 4.作用: 可以写提示,但这个不是主要功能. 第二个功能,就是3里标明的可以把方法名不同但功能相似的合成一个来写
*
*/
class Person{
public $arr = array("a","b","c");
function __call($method,$args){
//echo "出错了,{$method}不存在<br>";
if(in_array($method,$this->arr)){
echo $args[0],"<br>";
}else{
echo "调用方法{$method}不存在<br>";
}
}
}
$p = new Person();
$p -> eat("肉");
$p -> a("a");
$p -> b("b");
?>
结果:
调用方法eat不存在
a
b
课时164 对象串行化(序列化)1
<?php
/*
* 对象串行化(序列化) --- 将对象转成字符串(不用看懂字符串)
* 返串行化 --- 将字符串转为对象
* 注意: 转化的时机:
* 1.将对象在网上传输时要将对象串行化
* 2.将对象长时间保存,保存到数据库保存到文件要将对象串行化
*
*
*/
include "clone.php";
$s = new Person("zaj",123,"man");
$s -> say();
//将对象串行化
$str = serialize($s);
//将对象保存在文件中
file_put_contents("objstr.txt",$str);
echo "对象转完字符串,保存到文件中成功<br>";
//返串行化
//对出字符串中文件中
$str2 = file_get_contents("objstr.txt");
$ss = unserialize($str2);
$ss -> say();
?>
结果:
我的名字是zaj
对象转完字符串,保存到文件中成功
我的名字是zaj
123
123
PHP课程笔记8