7.PHP实习生考核卷

1.访问控制(可见性)的修饰词和描述

对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问

答:

 PHP中有三种访问修饰符,分别是:

  • public(公共的、默认)能被外部代码访问和操作
  • protected(受保护的)类的子类能被访问
  • private(私有的)类的内部能被访问
  • static (静态的)

    它们可以分别用在类的属性和方法上(类的属性和方法统称为类的成员),用来修饰类成员的访问权限。   

public(公共的、默认)

    在PHP5中如果类没有指定成员的访问修饰符,默认就是public的访问权限。

/*
以下两个方法声明访问权限效果相同
*/
function say(){};
publilc function say(){};

    当类的成员被声明为public的访问修饰符时,该成员能被外部代码访问和操作。

private(私有的)

     被定义为private的成员,对于类内部所有成员都可见,没有访问限制。对类外部不允许访问。

protected(受保护的)

      protected稍微有点复杂,被声明为protected的成员,只允许该类的子类进行访问。

 

     访问权限情况表:

访问权限

public

protected

private

所有

 

 

子类

 

类内

 

<?php
class Woman{
    public $name = 'lisa'; // 公共的访问权限
    protected $money = 3000.00; // 受保护的权限
    private $age = 35; // 私有的访问权限
    
    function printInfo(){
        echo $this->name; 
        echo $this->money;
        echo $this->age;
    }

    private function secret(){
        echo "这是个秘密!";
    }
}

$woman = new Woman();
echo $woman->name; // 公共属性可以访问
// echo $woman->money; // 受保护属性,报致命错误
// echo $woman->age; // 私有属性,报致命错误

$woman->printInfo(); // 可以打印三个属性的信息,因为printInfo是公共方法

// $woman->secret(); // 私有方法,访问出错

class Girl extends Woman{
// 可以重新定义父类的public和protected方法,但不能定义private的
    // protected $money = 2000.00; // 可以从新定义

    function printInfo(){
        echo $this->name; 
        echo $this->money; 
        // echo $this->age; // 找不到属性
    }
}

$girl = new Girl();
echo $girl->name; // 公共属性可以访问
// echo $girl->money; // 受保护属性,报致命错误
// echo $girl->age; // 私有属性,找不到属性
$girl->printInfo(); // 显示$name,$money,找不到$age属性;
?>

2.static关键字的使用?final的使用?::的使用场景??

本页说明了用 static 关键字来定义静态方法和属性。static 也可用于定义静态变量以及后期静态绑定

答  1》声明类、属性或方法为静态,就可以不实例化类而直接访问。

静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。

就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 selfparent 或 static

2》final---用于类、方法前。 
final类---不可被继承。 
final方法---不可被覆盖。 

属性不能被定义为 final,只有类和方法才能被定义为 final。

3》::---静态化方法、属性的访问。

3.重载overloading指的是什么?

答:是指动态地创建类属性和方法。

我们是通过魔术方法(magic methods)来实现的。

当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。

所有的重载方法都必须被声明为 public

PHP中的重载与其它绝大多数面向对象语言不同。

传统的重载是用于提供多个同名的类方法,

但各方法的参数类型和个数不同。

属性重载只能在对象中进行

 

在给不可访问属性赋值时,__set() 会被调用。

读取不可访问属性的值时,__get() 会被调用。

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值

在静态方法中,这些魔术方法将不会被调用。

所以这些方法都不能被 声明为 static

从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。

4.==和===的区别?

答:==:值相同即可

===:值,类型相同。如果是数组,顺序相同,类型相同。

5.php支持可变参数吗?规则?

支持。

6.@test和&test的区别?php的引用指什么?

答1@:错误抑制符。简单来说,可以屏蔽错误,实际上不推荐这样做,而是做异常处理。
&:地址符号。引用传址(传递的内存地址,传址比传值准确一些)

答2:在 PHP 中引用意味着用不同的名字访问同一个变量内容。

PHP 的引用允许用两个变量来指向同一个内容

7.不使用?>闭合标签的好处?

好处:如果这个是一个被别人包含的程序,没有这个结束符,可以减少很多很多问题,比如说:header, setcookie, session_start这些动作之前不能有输出,如果不小心在?> 后边加了不可见字符(多余的空格、换行符)等破坏页面显示,就会报"Header already sent"错误,不写的话不会有此问题。另,可以直接把光标移到最后,接着编程。

8.解释一下依赖注入,怎样实现,他解决了什么问题。

解释:应用程序依赖容器创建并注入它所需要的外部资源;

解决的问题:降低耦合性,实现惰性加载,便于管理。

9.解释Traits。应用场景

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

优先顺序是当前类中的方法会覆盖 trait 方法,

而 trait 方法又覆盖了基类中的方法。

10.

11.解释命名空间?

答:namespace 一种封装事物的方法,主要解决重生问题。

使用use语句的作用和include和require 的作用有什么区别?

答:引入文件时,报错方式不一样。

    include引入文件不存在时,停止运行

    require引入文件不存在时,继续执行。

use 右斜杠/,参数值是命名空间

use左斜杠\,   参数值是文件地址

命名空间和文件目录有关系吗?

答:作用是相同的,目的是给文件分组,不一定直接对应。

命名空间=文件目录/+目录分隔符。

类名和文件名有关系吗?

答:一般相同,linux写必须一致,包括大小写,否则无法自动加载类。

12。类的自动加载怎样实现?composer是怎样处理的?

12.1 spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)

<?php
spl_autoload_register(function ($class_name) {
    require_once $class_name . '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2();
?>

12.2

composer中有自动生成的autoload.php文件

12.1你只需要将下面这行代码添加到你项目的引导文件中:

require 'vendor/autoload.php';
require __DIR__ . '/../../vendor/autoload.php';

12.2你可以在 composer.json 的 autoload 字段中增加自己的 autoloader。

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

Composer 将注册一个 PSR-4 autoloader 到 Acme 命名空间。

你可以定义一个从命名空间到目录的映射。此时 src 会在你项目的根目录,与 vendor 文件夹同级。例如 src/Foo.php 文件应该包含 Acme\Foo 类。

添加 autoload 字段后,你应该再次运行 install 命令来生成 vendor/autoload.php 文件

引用这个文件也将返回 autoloader 的实例,你可以将包含调用的返回值存储在变量中,并添加更多的命名空间。这对于在一个测试套件中自动加载类文件是非常有用的,例如。

$loader = require 'vendor/autoload.php';
$loader->add('Acme\\Test\\', __DIR__);

除了 PSR-4 自动加载,classmap 也是支持的。这允许类被自动加载,即使不符合 PSR-0 规范。

13.composer怎样安装软件,怎样标识所需要的版本号。如果要在增加一个类库执行哪个命令?

13.1  composer install

13.2   ~1.2

13.3composer.json中添加如下语句

 "require": {
        "monolog/monolog": "1.21.*",
    }

或者

php composer.phar require vendor/package:2.* vendor/package2:dev-master

最后composer install

14.为什么使用PDO,有什么好处?

是一个对多种数据库提供统一操作方法的数据库访问层

0。可以操作多种数据库

   1.PDO可以使用异常(exception)处理错误,这意味着你需要把(处理PDO的)包括在一个try/catch块内。

    2.兼容跟更多数据库
       名称式参数
       对象映射

3.使用语句预处理将帮助你免于SQL注入攻击。

我们为什么要使用PDO?
 1、更换数据库时取得极大便利
在PHP4/3时代,PHP要利用php_mysql.dll、php_pgsql.dll、php_mssql.dll、 php_sqlite.dll等等扩展来连接MySQL、PostgreSQL、MS SQL Server、SQLite,这其实也没什么。也就是在配置时多添句话就行了。
可怕的是,这些扩展和各自对应的数据库打交道时,他们各自的函数有很多是不一样的。
比如:
PHP利用libmysql.dll和MYSQL打交道时,如果要从数据表中提取数据作为关联数组,用的是mysql_fetch_accoc,而如果要从postgre数据库取得同样的结果,你就不得不用pg_fetch_assoc。
很简单的例子说明了很重要的问题,假如你要更换数据库类型,比如从MYSQL更换成POSTGRE,你就不得把你所有和数据库有关的程序都改一遍。这时候,你应该会明白,为什么我不用PDO??
2、极大提高程序运行效率
针对上面的情况,也许你会说,我可以使用ADODB(LITE),PEAR::db来实现对不同类型数据库函数的封装啊。这样子,即使我更换数据库,也不需要修改程序。
答:php代码的效率怎么能够和直接用C/C++写的扩展效率比较呢?根本不是一个数量级的。
OK,从现在开始用PDO进行你的开发吧。

15.PHP有几个错误严重性等级?产生的场景

  •  Deprecated最低级别错误,程序继续执行。由于使用了不推荐的、过时的函数或语法造成。
  •  Notice 通知级别的错误, 如直接使用未声明变量,程序继续执行。,如访问未定义的变量和数组索引
  •  Warning 警告级别的错误,可能得不到想要的结果。通常被保留为环境错误,如无法执行脚本访问数据库,在语法中出现很不恰当的情况才会出现此错误,比如函数参数不匹配。会导致得不到预期的结果,需要修改代码。 
  •  Fatal error  致命级别错误,程序不往下执行。,通常发生在操作系统级别上例如分配内存时发生的错误
  •  parse error 语法解析错误,最高级别错误,连其他错误信息也不呈现出来。编译时的发生的语法错误,上面几种都属于运行时错误,此错误在运行前就会抛出。
  •  E_USER_相关错误 用户设置的相关错误

17.通常怎么处理异常?

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { ... } 来捕获 Error。你可以用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error

19.

编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
1
2
3
4
5
6
7
8
9
10
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+
1
2
3
4
5
6
7
8
9
10
引用大佬的建表语句,方便测试自己的猜想:

Create table If Not Exists Scores (Id int,Score DECIMAL(3,2));  
Truncate table Scores;  
insert into Scores (Id, Score) values ('1','3.5');  
insert into Scores (Id, Score) values ('2','3.65');  
insert into Scores (Id, Score) values ('3','4.0');  
insert into Scores (Id, Score) values ('4','3.85');  
insert into Scores (Id, Score) values ('5','4.0');  
insert into Scores (Id, Score) values ('6','3.65');  
1
2
3
4
5
6
7
8
查询去重后分数的,条件:当前行分数大于等于同表的分数的count数量,去重显示,然后降序输出

# 方法一:
# select Score, (select count(distinct Score) from Scores where Score>=s.Score) as Rank from Scores as s order by Score desc;  
1
2
首先查找去重后的分数作为新表,使用count统计行,条件:当前去重表后的分数>=未去重的分数作为Rank的参数,然后使用排序降序输出

# 方法二:
select Score,(select count(*) from (select distinct Score as s from Scores) as new_scores where s >= Score)as Rank from Scores order by Score desc;  
-

20.查询每个部门工资最高的员工

CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id唯一标识 /注:自增',
`name` varchar(50) DEFAULT NULL COMMENT '名称',
`salary` int(11) DEFAULT NULL COMMENT '薪水',
`departmentId` varchar(50) DEFAULT NULL COMMENT 'ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id唯一标识 /注:自增',
`name` varchar(50) DEFAULT NULL COMMENT '部门名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门表';

insert into employee (id,name,salary,departmentId) value (1,'Joe',70000,'1');
insert into employee (id,name,salary,departmentId) value (2,'Henry',80000,'2');
insert into employee (id,name,salary,departmentId) value (3,'sam',60000,'2');
insert into employee (id,name,salary,departmentId) value (4,'max',90000,'1');
insert into department (id,name) value (1,'IT');
insert into department (id,name) value (2,'Sales');
select d.Name as department,e.Name as employee,Salary
from employee e join department d on e.departmentId=d.Id
where (e.Salary,e.departmentId) in (select max(Salary),departmentId from employee group by departmentId);

select d.Name as department,e.Name as employee,e.salary
from department d,employee e
where e.departmentId=d.id and e.salary=(Select max(salary) from employee where departmentId=d.id);


select salary,departmentId from employee order by departmentId;#按DepartmentId排序查询

select max(salary),departmentId from employee group by departmentId;#按DepartmentId分组查询

#查询每个部门的员工工资总和
select sum(salary),departmentId from employee group by departmentId;

 

 

21.yii中modules和models分别是什么。举例说明?

modules:模块,是一个小的应用结构,包括:modles,views,controller。

models:模型。是 MVC 模式中的一部分, 是代表业务数据、规则和逻辑的对象。

22.yii中的application是指什么?有哪些属性。怎样使用?

应用主体是管理 Yii 应用系统整体结构和生命周期的对象。 每个 Yii 应用系统只能包含一个应用主体,应用主体在 入口脚本 中创建并能通过表达式 \Yii::$app 全局范围内访问。

答:require __DIR__ . '/../vendor/autoload.php';

require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

// 加载应用主体配置

$config = require __DIR__ . '/../config/web.php';

// 实例化应用主体、配置应用主体

(new yii\web\Application($config))->run();

必要属性

在一个应用中,至少要配置2个属性: id 和 basePath

23.yii怎样实现登录的用户无需再次登录?说明原理。

答:

24yii框架的整体架构

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值