trait 关键字直接在你文件头部use引用 + 类里面use 一般用于框架里面做单例模式的容器
trait World {
public function sayWorld() {
echo 'World';
},
public static shu(){
echo 666;
}
}
Hello {
use World
public function sayWorld() {
echo 'World';
}
}
$user=new Hello();
$user::shu; //每个被引入的 trait 都会自动有这个方法
echo static::$test; // 被继承的时候返回调用者的实例
echo self::$test; // 被继承的时候,返回父级的实例
new static //的用法区别在与是否有继承,一般用来返回自身实例
__call(name,args) 当要调用的方法不存在或权限不足时,会自动调用__call 方法。能获取到方法名和参数
__callStatic() 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。
双冒号::调用函数 $a::b()
在类里面的时候,$this->func()和self::func()没什么区别。
在外部的时候,->必须是实例化后的对象使用; 而::可以是未实例化的类名直接调用。
/* * 绕过去实现动态class */
$class = 'C' . Random::character(16);
$classContent = '<?php
namespace EasySwoole\MysqliPool;
use EasySwoole\Component\Pool\AbstractPool;
class ' . $class . ' extends AbstractPool {
protected function createObject()
{
return new Connection($this->getConfig()->getExtraConf());
}
}';
$file = sys_get_temp_dir() . "/{$class}.php"; //返回临时目录
file_put_contents($file, $classContent);//写入文件
require_once $file; //动态引入文件
unlink($file);//删除这个目录文件
$class = "EasySwoole\\MysqliPool\\{$class}";
$poolConfig = PoolManager::getInstance()->register($class);
<?php
//类名::class的用法 会输出一个限定路径NS\ClassName
namespace NS {
class ClassName {
}
echo ClassName::class; //输出NS\ClassName
}
?>
//static::class; 的用法也是在与有没有继承,没继承都是取的类名
class P
{
public static function getParent()
{
return self::class;
}
public static function getChild()
{
return static::class;
}
}
class C extends P
{
}
echo C::getParent(), 返回 p
echo C::getChild(), 返回 C
JsonSerializable是一个接口任何实现了这个接口的类, 需要定义一个jsonSerialize()方法,
这个方法会在对这个类的对象做Json化的时候被调用, 这个时候你就可以在这个方法内 , 随意调整最终的Json化的结果。
class Man implements JsonSerializable {
private $a, $b;
public function __construct($a, $b) {
$this->a = $a;
$this->b = $b;
}
public function jsonSerialize() {
return $this->a + $this->b;
}
}
echo json_encode(new Man (23, 42));// 输出65
<?php
/**
__call魔术方法的意思是:当调用一个不可访问或者不存在的函数的时候会触发这个魔术方法
*-------------------------------------------------------------
*正是鉴于__call()或__callStatic()方法的这种特性,即所传入的$name和$arguments,它们就用来实现重载!这点与JS每一个普通方法中都可以获取到一个arguments数组其实异曲同工
*举个例子
*/
class Foo1{
public function __call($name,$arguments){
if($name=="doStuff"){
/**
*实际上,不仅仅可以第一个参数类型,还可以判断参数个数,以及参数顺序,那么就和C++等强数据类型语言的重载效果是一样的了!
*/
if(is_int($arguments[0])){
$this->doStuffForInt($arguments[0]);
}else if(is_string($arguments[0])){
$this->doStuffForString($arguments[0]);
}
}
}
private function doStuffForInt($a){
echo "执行的是doStuffForInt()方法";
}
private function doStuffForString($a){
echo "执行的是doStuffForString()方法";
}
}
$foo1=new Foo1;
$foo1->doStuff('1');
php 函数 class_alias 用法:可以在多个数组里创建类的别名,拥有原来类的所有功能
<?php
class abc_efg_hi {
function xx() {
echo 'hi xx';
}
}
$alias = array(
'abc_efg_hi' => 'm'
);
foreach ($alias as $k => $v) {
class_alias($k,$v); //第一个参数是原来类的名称,第二个名称是别名
}
$m = new m();
$m->xx(); //这样就拥有这个类的所有功能
<?php
//检查键名 "Volvo" 是否存在于数组中
$a=array("Volvo"=>"XC90","BMW"=>"X5");
if (array_key_exists("Volvo",$a))
{
echo "Key exists!"; //存在
}
else
{
echo "Key does not exist!";
}
?>
is_object() 函数用于检测变量是否是一个对象。是返回true,可以传类对象,$obj_name = new stdClass;
is_callable() 判断一个字符串是否是可调用的函数
is_string() 函数用于检测变量是否是字符串。可以过滤掉 数字和null
isset($a) 检测变量是否是设置并且不为null。 正确返回true
empty() 以下被认为是空的: 空的是返回true。
"" (空字符串)0 (作为整数的0)0.0 (作为浮点数的0)"0" (作为字符串的0)
NULL FALSE array() (一个空数组) $var; (一个声明了,但是没有值的变量)
serialize() 把类对象、数组序列化后存储到数据库或者传输,当取出来用的时候再unserialize恢复
settype($foo, "integer"); // $foo 现在是 5 (integer) 类型转换
settype($bar, "string"); // $bar 现在是 "1" (string) 类型转换
<?php
class test implements JsonSerializable
{
private $b;
public function __construct($b)
{
$this->b=$b;
}
public function jsonSerialize()
{
return 'b:'.$this->b;
}
}
$test=new test(1);
echo json_encode($test).PHP_EOL; // b:1
当一个类继承了 implements JsonSerializable 的时候,
如果外部 json_encode的时候会自动调用 jsonSerialize() 这个方法。自定义输出编码格式
可以主动调用函数方法
call_user_func('自定义函数名称', '字符串参数');
//注意,必须是要实例化的,除非是static
$world = new World();
call_user_func([$world, '类里面的参数名'], '字符串参数');
call_user_func_array('say', ['hello world']); //注意:第二个参数是数组的形式这是php5.4兼容
call_user_func_array([类对象, '参数名'], ['hello world']); //注意:第二个参数是数组形式
php 标量类型声明 有时可以看到声明的是某个类对象 其他对象。。。
// 强制模式 会把参数变成 int类型
function sum(int ...$ints) :void //加了这个表示返回类型声明
{
return array_sum($ints);
}
// 严格模式 注意顶部要加上下面这句才生效 当传个不同类型的参数就会报错
declare(strict_types=1);
function sum(int ...$ints) :int //加了这个表示返回类型声明
{
return array_sum($ints);
}
魔术方法:
__destruct
析构函数,哪怕脚本调用exit(),die() 类的析构函数也会被执行
当类被手动销毁,或者脚本结束时,gc回收触发。可以执行一些后置操作,比如删除临时目录下的文件
__get
读取不可访问属性的值时,__get() 会被调用。
__set
在给不可访问属性赋值时,__set() 会被调用。
__isset
当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
__unset
当对不可访问属性调用 unset() 时,__unset() 会被调用。
__clone
当对象复制完成时调用
__toString() 方法用于一个类被当成字符串时应怎样回应。
比如,在我们接入微信支付的时候,经常需要把参数排序、拼接成url格式
我们完全可以定义一个类,然后在toString魔术方法中,写明排序、转换为url格式的操作。
在程序执行前,serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用,
然后才执行串行化(序列化)操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组。
如果该方法不返回任何内容,则NULL被序列化,导致 一个E_NOTICE错误。与之相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,预先准备对象数据。
__invoke
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
class A
{
function __invoke($params) {
var_dump($params);
}
}
$obj = new A();
$obj(5);
var_dump(is_callable($obj));
php7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。
class A {
private $x = 1;
}
// PHP 7+ 代码
$getX = function() {
return $this->x;
};
echo $getX->call(new A); 把这个 $getX 闭包函数绑定到 类A上面,并执行输出 1
array_key_exists() 函数检查键名 "Volvo" 是否存在于数组中:
$a=array("Volvo"=>"XC90","BMW"=>"X5");
if (array_key_exists("Volvo",$a))
{
echo "Key exists!";
}
basename()
$path = "/testweb/home.php";
basename($path) //返回文件名部分home.php
待更新
2020、1、16号早上
来源:CSDN
作者:会点php的前端小渣渣
链接:https://blog.csdn.net/qq_39523111/article/details/103945271