类的静态成员;接口、抽象类、trait ;后期静态
- 类的静态成员、类引用
static 标识静态成员
self 类引用,self::,$this用于对象引用
const 类常量
__callStatic,调用不存在或无权访问的静态方法时会被调用
::范围解析符,self::用于类常量静态成员的访问
class Teacher{
// 类常量
public const CATES = ['前端','后端','全栈'];
// 静态属性和类常量,属于类本身,不需要实例化就可以访问
public static string $uname;
private static int $salary;
public static string $siteName= '中文网';
static int $count = 0;
public function __construct($uname,$salary){
self::$salary=$salary;
self::$uname=$uname;
self::$count++;
}
static function getName(){
return self::$uname.'是老师。';
}
}
$user = new Teacher('mj', 2000);
echo Teacher::$uname;//带$
print_r(Teacher::CATES);//不带$
echo Teacher::getName();
echo Teacher::$count;
- 接口、抽象类、trait
接口是定义,主管的角色,类是实现,接口是抽象的类
interface Demo
{
//所有成员必须公开
public const CITY = 'JinHua';
// 所有方法都是抽象方法,只声明不实现
public function sum($arr);
public function sub($a, $b);
public function mul($arr);
public function div($a,$b);
}
interface test {
public const T =100;
}
abstract class Demo1 implements Demo, test
{
//未实现全部方法则用抽象类,抽象类中可包含抽象方法和实例方法,不能被实例化
//抽象类可以对应多个接口,用“,”隔开
//同名方法优先级 类同名方法>trait>继承成员方法
public function sum($arr)
{
return array_sum($arr);
}
public function sub($a, $b)
{
}
public function mul($arr){}
public function div($a,$b){}
}
class Work extends Demo1
{
use t1, t2;
public function sum($arr)
{
return array_sum($arr)+100;
}
public function sub($a, $b)
{
return $a - $b;
}
}
$obj = new Work;
echo $obj->sum([2, 34, 5]);
$obj->dd('hello');
trait 功能组合实现多继承,给予类的语法,对类功能扩展,不能实例化
trait t1{
public function dd($data){
var_dump($data);
die;
}
}
- 后期静态绑定 static::
class Car
{
private static function getName()
{
return 'car';
}
public static function run()
{
//self取决于定义类,不能动态绑定;如需动态绑定改用static,static被绑定调用的类,用于静态继承
// return self::getName();
return static::getName();
}
}
class Benz extends Car{
public static function getName()
{
return 'E300';
}
}
echo Car::run();
echo Benz::run();
// $my = new Benz;
// echo $my::run();
用final标识类在子类中不能被修改,self与static效果同
4.命名空间及USE的使用
全局成员有常量 命名函数 类(接口),会有命名冲突的问题
namespace name1;
class test{
public static function show(){
return __METHOD__;
}
}
namespace name2;
class test{
public static function show(){
return __METHOD__;
}
}
echo test::show();
//访问其他命名空间需加空间名,‘\’返回到根空间
echo \name1\test::show();
echo call_user_func(['name2\test', 'show']);
//命名空间的函数>系统函数的同名函数
在框架入口文件中,可用as给use的文件夹起别名,不起别名默认最后一段
const DS= DIRECTORYSEPARATOR;
require _DIR.DS.’autoload.php’;
use app\controller as ac;
use app\controller;
echo ac\Index::index();
echo controller\Login::index();
在自动加载时,要注意文件目录的设置,
总结:
spl_autoload_register(function($className){
// echo $className.'<hr>';
$file = __DIR__.DS.'class'.DS.$className.'.php';
$file = str_replace("\\",DIRECTORY_SEPARATOR,$className).'.php';
if(is_file($file)&&file_exists($file)) require $file;
// echo $file.'<hr>';
// echo __DIR__;
});
这段老师讲的比较乱,还是去自学消化吧!
【来源:国外高防服务器 http://www.558idc.com/stgf.html 欢迎留下您的宝贵建议】