Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:
php所提供的“重载”是指通过魔术方法来动态的“创建”类属性和方法。
当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用,所以重载的方法都必须被声明为public。
名称 | 属性 |
---|---|
public __set($name,$value) | 在不给不可访问属性赋值时,__set会被调用 |
public __get($name) | 读取不可访问属性的值时,__get会被调用 |
public __isset($name) | 当对不可访问属性调用isset()或empty()时,__isset会被调用 |
public __unset($name) | 当对不可访问属性调用unset()时,__unset()会被调用 |
参数$name是指要操作的变量名称,__set()方法的$value参数指定了$name变量的值 —>
class PropertyTest {
// 被重载的数据保存在此
private $data = array();
public function __set($name,$value)
{
echo "Setting '$name' to '$value' \n";
$this->data[$name]=$value;
}
}
$obj = new PropertyTest;
$obj->a = 1;
//以上会输出:Setting 'a' to '1'
名称 | 属性 |
---|---|
public __call($name,$arguments) | 在对象中调用一个不可访问方法时,__call()会被调用 |
public static __callStatic($name,$arguments) | 在静态上下文中调用一个不可访问方法时,__callStatic会被调用 |
class MethodTest
{
public function __call($name,$arguments)
{
echo "Call object method '$name'". implode(',',$arguments)."\n";
}
public static function __callStatic($name,$arguments)
{
echo "Call static method '$name'". implode(",",$arguments)."\n";
}
}
$method_obj = new MethodTest;
$method_obj->runTest('in object context');
//运行结果:Call object method 'runTest'in object context
echo "<br>";
MethodTest::runTest('in static context');
//运行结果:Call static method 'runTest'in static context
PHP中的全局成员有:类(class),常量(const),函数(function);
全局成员的特点是:一旦定义就不能重复声明,例如:
const abc = 123;
const abc = 321;
class a{
}
class a{
}
运行后会出现报错:
为了解决此类问题接下来我们需要接触命名空间的概念
概述: 在 PHP 中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
namespace a
{
$title = "php中文网";
echo "当前空间的变量:".$title;//本空间访问
echo "<br>";
const name = 'Jasper';
}
namespace b
{
echo '访问另一个空间中的变量'.$title;
}
//全局命名空间:
namespace
{
echo "<hr>";
echo '全局空间中访问另一空间中的变量'.$title;
echo "<hr>";
echo a\name;
}
运行结果:
为了防止一个空间中的代码过大,可以将同一空间的代码写到多个脚本中:
例如创建一个test1的php文件,再创建一个命名空间:
namespace ns;
class test1{
//...
}
再创建一个test2的php文件,并在当中创建同名的命名空间和不同的类名:
namespace ns;
class test2{
//...
}
再到另一个文件引入,并验证:
namespace ns;
require 'test1.php';
require 'test2.php';
echo test1::class,'<br>';
echo test2::class;
运行结果如下:
例如我们创建一个命名空间,并创建两个子空间:
//父空间:
namespace father{
class test
{
}
}
//子空间:
namespace father\son{
class test
{
}
}
//son的子空间:
namespace father\son\grandson{
class test
{
}
}
在子空间访问任何空间的方法:
//子空间:
namespace father\son{
class test
{
}
//访问它的子空间grandson的方法:
echo grandson\test::class,"<br>";
}
//son的子空间:
namespace father\son\grandson{
class test
{
}
//访问它的上级空间:
echo \father\son\test::class,'<br>';
echo \son\test::class,'<br>';
}
运行结果: