静态成员
静态的成员(静态属性和静态方法)
静态变量关键字:static 可写在权限修饰符前也 可以写在权限修饰符后
<?php
class Book
{
//使用static关键字声明成员是静态的
private static $sum = 0;
public function showme()
{
//访问静态成员,必须使用self关键字和 :: 操作符
self::$sum++;
printf('你是第%d位访客<br/>', self::$sum);
}
}
//第一次实例化对象
$b1 = new Book();
$b1->showme();
//第二次实例化对象
$b2 = new Book();
$b2->showme();
//第三次实例化对象
$b3 = new Book();
$b2->showme();
注意1:静态属性的作用是:保留原始数据值 并往下叠加
如果不使用static 属性 则每一次答案都是 你是第一位访客。
注意2:在类中访问静态属性时可以用self::$属性名 (注意加上$符号 表示的是成员属性名 如果不加 表示常量) 形式(self)代表当前类, 也可以写 类名::属性名 (但建议一般写第一种方式 因为 self代表的就是本类所以再修改类名的时候 self代替了该类名),另外 在类外访问静态方法时就只能用 类名::静态属性方法名 在类外不可以调用self (代表当前类)$this(代表当前方法)也同理。
注意3:静态方法必须使用静态成员。
静态成员和类常量的区别:类常量一次http中请求过程中 值永远不变
静态变量不是 静态变量没有权限
单例模式的特点:
一个类只能创建一个对象
虽然单例模式运行出来有时候是两个值 但是 它代表的是一个对象单号 我们可以有两种测试方法1: 可以使用var_dump(
d
b
1
,
db1,
db1,db2)的方法看结果是不是一个对象单号(#1)
方法2:可以使用=== if条件判断方法 测试
单位模式的代码需要实现哪些功能
简称:三私一公、
1,私有的静态的保存对象的属性
2,私有构造方法
3,私有的克隆方法
4公共的静态对象方法
<?php
//单例
class Uni
{
//创建静态私有的变量保存该类对象
static private $instance;
//构造方法是私有,防止外部直接创建对象
private function __construct()
{
}
//防止克隆对象
private function __clone()
{
}
static public function getInstance()
{
//判断$instance是否是Uni的对象
//没有则创建
//注意instanceof的使用
if (!self::$instance instanceof self) {
self::$instance = new self(); //在类中实例化本类的对象,使用self
}
return self::$instance;
}
//普通方法
public function method()
{
echo '正常执行对象中的方法';
}
}
$ob1 = Uni::getInstance(); //获取uni的对象
$ob1->method();
echo "<br>";
$ob2 = Uni::getInstance();
$ob2->method();
echo "<br>";
测试单例方法一:
if ($ob1 === $ob2) {
echo 'obj和ob2是同一个对象';
} else {
echo 'obj和ob2不是同一个对象';
}
测试单例方法二:
var_dump($boj1,$obj2);
克隆:
关键字:clone;
注意:克隆出来的对象 还是两个。
<?php
class Student
{
public $name;
}
$s1 = new Student();
$s1->name = '张三';
//克隆对象
$s2 = clone $s1;
$s2->name = '李四';
echo $s1->name;
echo '<br>';
echo $s2->name;
对象赋值:
对象之间的赋值,实际就是引用赋值,两个对象之间赋值后,就是一个对象了。所以当一个对象的内容发生变化后,另一个对象的内容也会发生变化。
普通变量之间的赋值,如果也想使用引用赋值,必须使用&,$name2 =& $name1;
那么, n a m e 1 和 name1和 name1和name2也变成了同一个变量,它们之间相互影响。
命名空间:关键字namespace
创建一个文件:student.php
<?php
namespace model; //定义命名间
//类Student在model命名空间中
class Student
{
public function say(){
echo 'hello';
}
}
创建一个测试文件:test.php
<?php
use model\Student; //引入 model命名空间的Student 类
require_once 'student.php';
$stu = new Student();
$stu->say();
类的自动加载
何时自动加载?
当试图使用未定义类时。
使用new创建不存在的类时。
继承一个不存在的类时。
使用静态方法调用一个不存在的类时,
当实现不存在的接口时。