1.类的扩展
- __get()
- __set()
- __construct()
- __destruct()
- __call()
- __callStatic()
class User{
static $min = 10;
private $data = [
'age' => 18,
];
function __get($name)
{
return array_key_exists($name,$this->data) ? $this->data[$name] : $name . '不存在';
}
function __set($name,$value)
{
if(!array_key_exists($name,$this->data))
{
$this->data[$name] = $value;
}
else
{
return $name . '名字已经存在';
}
}
function __call($name,$arge)
{
printf('%s,%s',$name,$arge);
}
static function __callStatic($name, $arguments)
{
// TODO: Implement __callStatic() method.
echo $name;
}
}
$user = new User();
echo $user->name;
$user->hellow(200);
$user::word(100);
echo User::$min;
class query
{
function table($table)
{
return $this;
}
function where($table)
{
return $this;
}
function find()
{
}
}
class Db
{
static function __callStatic($name,$argement)
{
return call_user_func_array([new Query(),$name],$argement);
}
}
Db::table('think_user')->where('id', 1)->find();
call_user_func_array():
1)普通使用:
function a($b, $c) {
echo $b;
echo $c;
}
call_user_func_array('a', array("111", "222"));
//输出 111 222
2)调用类内部的方法:
Class ClassA {
function bc($b, $c) {
$bc = $b + $c;
echo $bc;
}
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));
//输出 333
2.接口类
<?php
//接口:抽象类和接口类似
//接口类
interface iUser
{
//类成员必须共有属性
function fun1();
function fun2();
}
//工作类
class Demo01 implements iUser
{
function fun1()
{
}
function fun2()
{
}
}
//PHP是单继承
3.接口类实现多继承
<?php
//接口:抽象类和接口类似
//接口类
interface iUser1
{
//类成员必须共有属性
function fun1();
function fun2();
}
interface iUser2
{
//类成员必须共有属性
function fun3();
function fun4();
}
//工作类
class Demo01 implements iUser1,iUser2
{
function fun1()
{
echo __METHOD__;
}
function fun2()
{
echo __METHOD__;
}
function fun3()
{
// TODO: Implement fun3() method.
echo __METHOD__;
}
function fun4()
{
// TODO: Implement fun4() method.
echo __METHOD__;
}
}
//PHP是单继承
$user = new Demo01();
$user->fun1();
$user->fun3();
4.命名空间的定义
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间,在不同的命名空间中可以出现同名现象
5.命名空间的访问
- 非限定访问
- 限定访问
完全限定
<?php
/**
* 命名空间
*
*/
namespace one;
class A
{
//静态方法中不能引用非静态变量!
//静态变量只能够类来引用
static $name = 'yk';
static function fun1()
{
return A::$name ;
}
}
echo A::class; //非限定访问
namespace two;
class A
{
static function fun1()
{
}
}
echo A::class;
echo \one\A::$name; //完全限定
three\A::fun1(); //限定访问
namespace two\three;
class A
{
static function fun1()
{
echo __METHOD__;
}
}
6.使用user
<?php
/**
* 1.路径
* 2.命名冲突问题
* use默认使用完全限定名称/绝对路径
* 3.
*/
namespace one;
class A
{
static $name = 'yk';
public static function fun1()
{
return A::$name;
}
}
use \one\two\A as B;
B::fun1();
namespace one\two;
class A
{
static $name = 'yk';
public static function fun1()
{
echo __METHOD__ . PHP_EOL;
return A::$name;
}
}
A::fun1();