php原生函数回顾记录

自作多情 提交于 2020-01-25 20:33:59
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号早上

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!