php 容易被面试官提到的知识点(面试题详细介绍)
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。 子类方法可以包含父类抽象方法中不存在的可选参数。 抽象类和接口的概念要分清楚,容易混淆 命名空间的理解有深度,需要花点力气学习下 PHP 命名空间中的类名可以通过三种方式引用: 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。 限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo。 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo。 注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 strlen() 或 Exception 或 INI_ALL。 在命名空间内部访问全局类、函数和常量: namespace Foo; function strlen() {} const INI_ALL = 3; class Exception {} $a = strlen('hi'); // 调用全局函数strlen $b = INI_ALL; // 访问全局常量 INI_ALL $c = new Exception('error'); // 实例化全局类 Exception ?> 关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。 namespace操作符,命名空间中的代码 namespace MyProject; use blahblah as mine; // see "Using namespaces: importing/aliasing" blahmine(); // calls function blahblahmine() namespaceblahmine(); // calls function MyProjectblahmine() namespacefunc(); // calls function MyProjectfunc() namespacesubfunc(); // calls function MyProjectsubfunc() namespacecname::method(); // calls static method "method" of class MyProjectcname $a = new namespacesubcname(); // instantiates object of class MyProjectsubcname $b = namespaceCONSTANT; // assigns value of constant MyProjectCONSTANT to $b ?> 使用命名空间:别名/导入PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。 在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子: 1、使用use操作符导入/使用别名 namespace foo; use MyFullClassname as Another; // 下面的例子与 use MyFullNSname as NSname 相同 use MyFullNSname; // 导入一个全局类 use ArrayObject; $obj = new namespaceAnother; // 实例化 fooAnother 对象 $obj = new Another; // 实例化 MyFullClassname对象 NSnamesubnsfunc(); // 调用函数 MyFullNSnamesubnsfunc $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use ArrayObject" ,则实例化一个 fooArrayObject 对象 ?> 导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。 3、导入和动态名称 use MyFullClassname as Another,MyFullNSname; $obj = new Another; // 实例化一个 MyFullClassname 对象 $a = 'Another'; $obj = new $a; // 实际化一个 Another 对象 ?> 全局空间如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。 使用全局空间说明 namespace ABC; /* 这个函数是 ABCfopen */ function fopen() { /* ... */ $f = fopen(...); // 调用全局的fopen函数 return $f; } ?> 名称解析遵循下列规则: 对完全限定名称的函数,类和常量的调用在编译时解析。例如new AB解析为类AB。 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间ABC被导入为C,那么对CDe()的调用就会被转换为ABCDe()。 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间AB内部调用CDe(),则CDe()会被转换为ABCDe()。 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间ABC导入为C,则new C()被转换为new ABC()。 在命名空间内部(例如AB),对非限定名称的函数调用是在运行时解析的。例如对函数foo()的调用是这样解析的: 在当前命名空间中查找名为ABfoo()的函数 尝试查找并调用全局(global)空间中的函数foo()。 在命名空间(例如AB)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用new C()及new DE()的解析过程:new C()的解析: 在当前命名空间中查找ABC类。 尝试自动装载类ABC。 new DE()的解析: 在类名称前面加上当前命名空间名称变成:ABDE,然后查找该类。 尝试自动装载类ABDE。 为了引用全局命名空间中的全局类,必须使用完全限定名称new C()。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |