;
类常量
内部访问 self::常量名
外部访问不需要实例化:类名::常量名
class Computer{
const yh = 12;
const yh2 = self::yh+1;
}
var_dump (Computer::yh2);
$this 和 self 的区别
一个是对象$this 相当于实例化后,可以说除了静态和const常量,基本上其他都可以使用this联络 ;
self则是类本身 self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化的
类的继承
存在意义:把相同的属性方法抽出来,让子类继承
extends 后只能一个逗号,就是说只能继承一个父类,单继承
class dad{
function eat(){
echo "我是父类的方法,子类可以继承我的方法";
}
}
class boy extends dad{
}
$boy = new boy();
$boy->eat();
子类也可以覆盖父类的方法
子类没有构造方法时,会调用父类的构造方法,有则调用自己的,
用关键字 parent:: __construct();可以调用父类的构造方法
用final关键字加在类前面就不会被继承;加到方法面前,此方法就不会被重写
命名空间(解决命名冲突问题)
利用文件系统不用目录的原理
被引入的php文件中加入 namespace 目录\子目录;
使用时调用:new 目录\子目录\类名();如 new com\session\computer();
受命名空间影响的有,类(包括抽象类,traits),接口,函数,常量(const和define都是用来声明常量的(它们的区别不详述),但是在命名空间里,define的作用是全局的,而const则作用于当前空间。)
要注意的是,当前脚本文件的第一个命名空间前面不能有任何代码,下面的写法都是错误的:
//例一
//在脚本前面写了一些逻辑代码
<?php
$path = "/";
class Comment { }
namespace Article;
?>
//例二
//在脚本前面输出了一些字符
<html></html>
<?php
namespace Article;
?>
为什么要说第一个命名空间呢?因为同一脚本文件中可以创建多个命名空间。
<?php
//创建一个名为'Article'的命名空间
namespace Article;
//此Comment属于Article空间的元素
class Comment { }
//创建一个名为'MessageBoard'的命名空间
namespace MessageBoard;
//此Comment属于MessageBoard空间的元素
class Comment { }
?>
由于每次调用都要写上路径,很麻烦,所以出现use的用法(use引入必须带类名或者函数名)
在调用时先用use引入,use 目录\子目录\类;还可以起个别名区别 as
use venter\session\computer;
use venter\computer as computer2;
new computer();
new computer2();
函数的话记得带上function
use function venter\session\computer;
computer();
常量记得带上const
use const venter\session\computer;
var_dump(computer);
重点:在命名空间里面调用全局的类,函数,常量的区别,
页面a定义了命名空间 namespace venter;引入b页面(全局空间)后,此时想调用b页面的类,必须:
New \venter() 加个\代表全局空间下的
但是调用函数和常量时,就不需要加,因为他会自动寻找,向全局寻找。
类自动加载:
当你实例化一个类时,这个类不存在,就会自动执行我们写的 function __autoload($className){},在这个自动函数的内部去执行我们想要操作的代码,参数就是我们实例化的类名,因此可以根据参数去引入php文件。
__autoload将被淘汰,使用新的函数 spl_autoload_register();参数可以传函数名或者匿名函数
spl_autoload_register(function($a){
echo $a;
}
);
new Computer();
或者
function aaa($a){
echo $a;
}
spl_autoload_register('aaa');
new Computer();
或者类的调用方法
class momo
{
function aaa($a){
echo $a;
}
}
spl_autoload_register([new momo],'aaa');
new Computer();
利用命名空间和自动加载实现项目自动引用
1,文件目录就和命名空间名一样,文件名和类名一样 new models\imooc() 就是在models文件下的imooc.php文件,
2,然后利用spl_autoload_register(function($classname){
include str_replace("\\","/",$classname.".php");
});
这里的作用是models\imooc替换掉models/imooc.php 引入
而imooc.php文件中必须命名 namespace models;
static 静态
存在的价值,为了让对象公用一些数据,做到统一性
当属性和方法被定义为 static 时就变成类的属性和方法,不属于对象的,不需要实例化
外部访问 类名::$aa 内部访问 self::$aa 或者static::$aa; 子类访问父类 parent::$aa;
静态方法不能调用非静态属性
因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象
class person{
public static $aa ="a";
public static function eat(){
echo self::$aa;
echo static::$aa;
}
}
class boy extends person{
public function eat2(){
echo parent::$aa;
}
}
echo(boy::eat2());
后期静态绑定:
class A{
public static function who(){
echo "A类的who方法";
}
public static function test(){
self::who();
/