PHPの知識ポイント-1

文字列の1.使用

可将字符串当作一个字符的集合来使用,可独立访问每个字符。仅适用于单字节字符(字母、数字、半角标点符号),像中文等不可用(utf8下,中文3字节表示)
$str = "abcd";
echo $str[3];   // d
echo $str{0};   // a
//另一种方式
也可以使用str_split把所有字符分割成数组。
$strArr = str_spilt($str);   //同样不适合中文
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)
function mb_str_split($str){
    return preg_split('/(?<!^)(?!$)/u', $str );   //反向预搜索
}
$str='博客';
mb_str_split($str);
打印结果如下:
Array
(
    [0] => 博
    [1] => 客
)

2.変換タイプ

通常、我々は変数プラス(int型)、(文字列)、前にいることを知っている (フロート) ディスプレイ等に変換するために、次のようにnull変換に直接変換することができますについて説明します。
(未設定)// NULLに変換

$a = 'a';
$a = (unset)$a;  //此时$a 为 NULL
//换种方式
$a = 'a';
unset($a);
dd($a);
//报错
PHP Notice:  Undefined variable: a in test.php on line 39

Notice: Undefined variable: a in test.php on line 39

3.issetと変数の空、is_nullを検出

存在しない変数を検出するために、3.1 ISSETは、falseを返します。ただし、変数自体がNull値であるかどうか、もしそうなら、またfalseを返します。会うないtrueを返します。
検出変数を容易にするために使用して、存在する
分析推奨array_key_existsを

$a = null;
$varExists = array_key_exists('a', get_defined_vars());
if($varExists){
        echo '变量a是存在的';
}


3.2そうでない場合はfalseに、検出変数は、それぞれNULL存在しない場合、0の値が真である、空の
3.3 IS_NULL
戻るTRUEん)(に、パラメータは次の3つの場合を満たす時間IS_NULL、他の状況はFALSEである
。1、割り当てられていますNULLされ
、それは値2がありません
3の後に、それが定義されていない、)、)(未設定(変数未設定の等価物は、それが定義されていないていないこと

4.staticパーツの使用状況

我々は、すべての静的直接静的変数や静的メソッドを定義し、このいずれかがクラスである場合、静的変数と静的メソッドは、::使用して呼び出すことができます呼び出し、それがクラス内にある場合、呼び出すために自己を使用することができることを知って
外側に、クラス名を使用します言っても過言で呼び出すが、ここではそのない、これらは、より一般的に使用されています。一般的に、次の話の下で使用されていません。

静的遅延クラスの静的結合;

延迟静态绑定是指允许在一个静态继承的上下文中引用被调用类。
延迟绑定的意思为:static::不再为定义当前方法所在的类,而是实际运行时所在的类。
(总的意思就是子类继承了父类后,父类中使用了一个静态方法或变量,如static::A(), 但方法A不存在于父类中,
存在于子类中,这样写是正确的,不会因为方法不存在而报错,因为static 修饰的A 会在执行过程中,绑定到具体的子类
上,只要保证子类有此方法即可)
注:它可以用于(但不限于)静态方法的调用。
self::,代表本类(当前代码所在类)
    永远代表本类,因为在类编译时已经被确定。
    即,子类调用父类方法,self却不代表调用的子类。
parent:: 代表父类
static::,代表本类(调用该方法的类)
    用于在继承范围内引用静态调用的类。
    运行时,才确定代表的类。
    static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
除了简单的static延迟绑定的用法,还有一种转发调用,
forward_static_call_array()(该函数只能在方法中调用)将转发调用信息(不过多赘述,类似于本节的第8点,PHP反射),
概括实例如下:
class A {
    public static function fooStatic() {
        static::who();
    }
    public static function who() {
        echo __CLASS__."aaa\n";
    }
}
class B extends A {
    public static function testStatic() {
        A::fooStatic();
        B::fooStatic();
        C::fooStatic();
        parent::fooStatic();
        self::fooStatic();
    }
    public static function who() {
        echo __CLASS__."bbb\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."ccc\n";
    }
}
C::testStatic();
大家一起来得到答案:

5. array_mergeアレイをマージ+

5.1 array_merge非数値キーは自動的にマージされているが、重複キー名ならば、後者は前を上書きする場合、時間の2つの以上の配列をマージ 配列は自動的に前のインデックス値に戻って変更する前に、それはインデックス値に基づいて行われますという名前のキー数値がインクリメントされている場合は、それが元のキーの名前を変更します。

5.2 +、配列をマージ+マージ配列、同じキー名の場合、キー名は、最初のキーの名前と番号、それが再配置されない場合でも、保持されます表示された、ビジネスシーンの一部の特性は非常になります使用します便利です。

5.3 array_pushは、ちょうど完全配列の対応する値の端に、元の構造は、まったく新しい値、前の増加が続くキー名として、保持されます。この区別のarray_merge

5.4 array_combine、二つのパラメータ、新しいアレイの鍵、新しいアレイの第2のパラメータ値としての第1のパラメータ、。既存のアレイに新しい値を追加しません。実際に、彼はアクション上記の3つの大差でした。名前の混乱からの光ジャッジ。

$a = ['a', 'b', 'c'];
$b = ['5' => 'test'];
$c = [1, 2, 3];

$arrayMerge   = array_merge($a, $b);
$arrayPlus    = $a + $b;
$arrayCombine = array_combine($a, $c);
array_push($a, $b);
// $arrayMerge
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => test
)
// $arrayPlus
Array
(
    [0] => a
    [1] => b
    [2] => c
    [5] => test
)
// $arrayCombine
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
// array_push
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => Array
        (
            [5] => test
        )

)

6.ポインター

数组的内部指针:
current/pos 返回当前被内部指针指向的数组单元的值,并不移动指针。
key         返回数组中当前单元的键名,并不移动指针
next        将数组中的内部指针向前移动一位,并返回移动后当前单元的值。先移动,再取值。
prev        将数组的内部指针倒回一位,并返回移动后当前单元的值先移动,再取值。
end         将数组的内部指针指向最后一个单元,并返回最后一个单元的值
reset       将数组的内部指针指向第一个单元,并返回第一个数组单元的值
each        返回数组中当前的键/值对并将数组指针向前移动一步。
            返回的是一个由键和值组成的长度为4的数组,下标0和key表示键,下标1和value表示值
在执行each()之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()。
1. 以上指针操作函数,除了key(),若指针移出数组,则返回false。而key()移出则返回null。
2. 若指针非法,不能进行next/prev操作,能进行reset/end操作
3. current/next/prev     若遇到包含空单元(0或"")也会返回false。而each不会!

list    把数组中的值赋给一些变量。list()是语言结构,不是函数。
仅能用于数字索引的数组并假定数字索引从0开始
/* 可用于交换多个变量的值 */ 
list($a, $b) = array($b, $a);
例:list($drink, , $power) = array('coffee', 'brown', 'caffeine');
1. 复制数组,其指针位置也会被复制。
    特例:如果数组指针非法,则拷贝的数组指针会重置,而原数组的指针不变。
    【指针问题】
        谁第一个进行写操作,就会开辟一个新的值空间。与变量(数组变量)值传递给谁无关。
        数组函数current()被定义为写操作,故会出现问题。
        foreach遍历的是数组的拷贝,当被写时,才会开辟一个新的值空间。
            即,foreach循环体对原数组进行写操作时,才会出现指针问题。
            如果开辟新空间时指针非法,则会初始化指针。
2. 如果指针位置出现问题,则reset()初始化一下就可解决。

7.シリアライゼーション(直列化)

# 数据传输均是字符串类型
# 除了资源类型,均可序列化
# 序列化在存放数据时,会存放数据本身,也会存放数据类型
作用:1.在网络传输数据时;2.为了将数组或对象放在磁盘时
# 序列化
serialize        产生一个可存储的值的表示
string serialize ( mixed $value )
- 返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。
- 有利于存储或传递 PHP 的值,同时不丢失其类型和结构。
# 反序列化
unserialize        从已存储的表示中创建PHP的值
mixed unserialize ( string $str [, string $callback ] )
- 对单一的已序列化的变量进行操作,将其转换回PHP的值。

8.PHP反射

時々、私たちはこのtrinity_middle_serviceな新倉庫として、あなたは私たちがタスクを完了を支援する言語のいくつかの機能を使用する必要があり、私たちはより良いコードの構造を構築することができますし、コードを再利用することができます注文、我々はPHPのネイティブ関数を使用する必要があり、 call_user_func_arrayとして、分配を達成するためにシンプルにすることができます。次のように使用されます:

class Order{
    public function getBasicInfo($orderId, $write = false)
    {
    }
}
$detailServiceInstance = new Order();
$functionName = 'getBasicInfo';
$params[0] = 1000001;    //或 $params['orderId'] = 1000001
$params[1] = true;       //或 $params['write'] = true
call_user_func_array([$detailServiceInstance, $functionName], $params);

即ち、2番目のパラメータは、所望の機能パラメータに対応する、上記のコードから分かるように、最初のパラメータは、例えば、クラス0の主題であるcall_user_func_array配列で、本実施例1本発明の方法の主題であります引数がので、ここで、各パラメータに対応する順序で自動的に、アレイ状call_user_func_arrayで、パラメータの順序は、関数ように、特定のパラメータを対応する必要があり、それは数字キーや文字キーの使用であるかどうか、が重要です分布関数の正しい実装。

反射の8.1アプリケーション

call_user_func_arrayを使用して、我々は単に配布、および各種パラメータだけでなく、非常に明確なを実現することができます。しかし、あなたは、この機能のより柔軟な使用が必要な場合、我々はまた、PHPの反射を導入する必要があり、PHPはReflectionMethodクラスが来るなど、
あらゆる種類の情報は、我々はこのようなパラメータとして、メソッドの特定のクラスに直接取得するには、このクラスを使用することができます数、パラメータ名、その上のデフォルト値、およびがある場合。コードは以下の通りであります:

$object = new Order();
$functionName = 'getBasicInfo';
$reflectionObj = new \ReflectionMethod($object, $functionName);
//通过以上的代码后,就可以直接通过$reflectionObj获取相关信息了,如下
$reflectionObj->isPublic();   //可判断该方法是否为公有方法, 还有isPrivate, isProtected, isStatic等等
$reflectionObj->getParameters();   //可获取该方法所有参数,是个数组,可 foreach获取具体的参数
foreach($reflectionObj->getParameters() as $arg) {
    if(array_key_exists($arg->name, $params)) {
        $callParams[$arg->name] = $params[$arg->name];
    } else {
        $paramVal = null;
        if ($arg->isOptional()) {  // 或使用isDefaultValueAvailable, 检测是否有可用的默认值
            $paramVal = $arg->getDefaultValue();
        }
        $callParams[$arg->name] = $paramVal;
    }
}
具体参数: https://www.php.net/manual/zh/class.reflectionmethod.php

ReflectionClassは、使用のようないくつかの情報が類似しているそこに着くことができます。

8.2メソッドの呼び出しが存在しません。

__call&__callStatic(マジックメソッド)
クラスが存在しないか、アクセスのない方法はありません呼び出すとき、それは自動的に__callを呼び出します()メソッドを使用します。__callおよび対応する静的メソッド呼び出しは、PHPの反射、行うには、特別なサービス機能に基づいて最適化されたコードで、__callStaticあり
、このような作業指示として、我々は同じよう三位一体の内部で使用されています。

9. move_uploaded_file

この機能は、バックグラウンドに、フロントファイルアップロードファイルの機能がアップロードした後、我々は$ _FILES [「ファイル」] [「tmp_name」](ファイルのアップロードアドレスの後)、使用を渡します、使用されるかもしれないです

move_uploaded_file($tmp_name, $savePath);

これは、一時的にデータベースに保存されますよう:コードが背後にある問題は、ファイルが表示されます見つけることができないときに、グローバル変数を$ _FILESを使用する必要があれば原因、離れて移動するために/ tmp / phpwTJzUwファイル。

前記送信基準

他の機能をarray_pop使用する場合、パラメータは、許可されていない将来の5.3のように、それは(厳密モードで)致命的なエラーを報告し、時には関数の戻り値に直接書き込まれる符号化処理のパラメータで、基準array_popによって渡されます。

You will see:
PHP Strict Standards:  Only variables should be passed by reference in - on line 3

Strict Standards: Only variables should be passed by reference in - on line 3
d
以上来自于: https://www.php.net/manual/zh/function.array-pop.php

按引用传递参数的函数在被按值传递调用时行为发生改变. 此前函数将接受按值传递的参数, 现在将抛出致命错误. 之前任何期待传递引用但是在调用时传递了常量或者字面值 的函数, 需要在调用前改为将该值赋给一个变量。
以上来自于:PHP手册附录从PHP 5.2.x 移植到 PHP 5.3.x 部分
https://www.php.net/manual/zh/migration53.incompatible.php

実際に間違って何も見えないと、単に機能を割り当てる必要があることは、それに渡されたパラメータとして変数、その後、変数に値を返します。
たとえば、コードに頻繁に書きました:

`` `
のerror_reporting(E_STRICT);
$ testArr = [ 'A'、 'B'、 'C'、 'C'、 'D'];
$ = popValue array_pop(array_unique(testArr $));
上記のコード//エラーは、使用しなければならない
$ testArr = [ 'A'、 'B'、 'C'、 'C'、 'D'];
$ testArr = array_unique(testArr $)
$ popValue array_pop =($ testArr)。

おすすめ

転載: www.cnblogs.com/hzqyihui/p/11653666.html