任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。
对于代码的理解,不同人能到达不同的层次。刚开始学习,停留在行级。入门之后,进步到方法级。工作之后,可以到达类级和模块级。
经验积累足够多了,会精进到架构级,甚至是更高的级别。
1.call 和new 区别
call_user_func_array 调用类的静态方法与实例方法
很多场景是这样的:
1、你要调用的函数名是未知的
2、要调用函数的参数类型及个数也是未知的
因为未知,所以得用call_user_func_array这样的函数。
<?php
class A {
function b($b) {
echo $b."\r\n";
}
static function c($c) {
echo $c."\r\n";
}
}
?>
在php5.3 之前是可以如下调用非静态函数的,系统会把b当做静态函数处理
call_user_func(array("A", "b"), "b");
在 php5.3 之后如果调用类的实例方法,必须通过类的实例调用,如下
$a = new A;
call_user_func(array($a, "b"), "b");
// 类的静态方法是可以通过如下两种方式调用的
call_user_func(array("A", "c"), "c");
call_user_func("A::c", "c");
//call_user_func_array 调用类的静态函数和实例函数
call_user_func_array(array($a, "b"), array("bb"));
call_user_func_array("A::c", array("cc"));
类方法 类属性
实例方法 实例属性
对象方法 对象属性
2.静态方法和普通的区别
static的属性,在内存中只有一份,为所有的实例共用 (单例) self:: 关键字访问当前类的静态成员。
一个类的所有实例,共用类中的静态属性。
也就是说,在内存中即使有多个实例,静态的属性也只有一份。
static关键字用来修饰属性、方法,称这些属性、方法为静态属性、静态方法。static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为"类属性"或"类方法" 不经过实例化,就可以直接访问类中static的属性和static的方法。static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调
静态属性不需要实例化就可以直接使用,在类还没有创建时就可以直接使用。
静态方法不能调用非静态属性 。不能使用self::调用非静态属性。
也不能使用 $this 获取非静态属性的值。
PHP5中,在静态方法中不能使用 $this 标识调用非静态方法。
当一个类中有非静态方法被self:: 调用时,系统会自动将这个方法转换为静态方法。
所有的重载方法都必须被声明为 public。
PHP所提供的“重载”(overloading)是指动态地“创建”类属性和方法。我们是通过魔术方法(magic methods)来实现的。
PHP中的“重载”与其它绝大多数面向对象语言不同。传统的“重载”是用于提供多个同名的类方法,但各方法的参数类型和个数不同。
当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。本节后面将使用“不可访问属性(inaccessibleproperties)”和“不可访问方法(inaccessiblemethods)”来称呼这些未定义或不可见的类属性或方法。
Note:
在给不可访问属性赋值时,__set() 会被调用。
读取不可访问属性的值时,__get() 会被调用
在对象中调用一个不可访问方法时,__call() 会被调用。
在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
范围解析操作符 ::(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
当在类定义之外引用到这些项目时,要使用类名。
self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。
使用静态变量
变量范围的另一个重要特性是静态变量(staticvariable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:
function test()
{
static $a = 0;
echo $a;
$a++;
}
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
自 PHP 5.4 起可用 callable 类型指定回调类型 callback。本文档基于同样理由使用 callback 类型信息。
一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
继承 封装 多态
多态其实就是根据参数不同而执行不同的方法。
java强类型 规定参数类型。php 弱类型 不明显。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 LINE 的值就依赖于它在脚本中所处的行来决定。
func_get_args — 返回一个包含函数参数列表的数组
在用户自定义函数外调用则会出现错误警告。
call_user_func — 把第一个参数作为回调函数调用
register_shutdown_function — 注册一个会在php中止时执行的函数
止回调是作为请求的一部分被执行的,因此可以在它们中进行输出或者读取输出缓冲区。
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。
开通阿里云 云服务器 域名
写csdn博客
学习 时间加长。
如何做项目经理
道与术 学PMP不如学习项目经理的思维方式
匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。
闭包可以从父作用域中继承变量。任何此类变量都应该用 use 语言结构传递进去。
而闭包的父作用域是定义该闭包的函数(不一定是调用它的函数)。示例如下:
array_walk — 使用用户自定义函数对数组中的每个元素做回调处理
array_map — 为数组的每个元素应用回调函数
优先级
从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称
在php5 的对象编程经常提到的一个关键点是"默认情况下对象是通过引用传递的"。
在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。