在PHP的广阔世界里,数组与对象无疑是两大基石,它们支撑着数据结构的构建与复杂逻辑的实现。对于PHP程序员而言,深入理解并掌握这两大概念,不仅是日常编码的必需,也是面试笔试中不可或缺的一环。本章将围绕PHP数组与对象的常见面试题展开,通过实战解析,帮助读者巩固知识,提升应对能力。
1.1 数组类型与创建
PHP支持索引数组和关联数组两种类型。索引数组使用数字作为键名,而关联数组则使用字符串或其他类型作为键名。
解析:
// 创建索引数组
$numbers = array(1, 2, 3, 4, 5);
// 或使用短数组语法(PHP 5.4+)
$numbers = [1, 2, 3, 4, 5];
// 创建关联数组
$users = array('id' => 1, 'name' => 'Alice', 'age' => 30);
// 或使用短数组语法
$users = ['id' => 1, 'name' => 'Alice', 'age' => 30];
1.2 数组遍历与操作函数
foreach
、array_map
、array_filter
等)。解析:
foreach
:用于遍历数组。
foreach ($users as $key => $value) {
echo "$key: $value\n";
}
array_map
:对数组中的每个元素应用回调函数,并返回结果数组。
$squared = array_map(function($n) { return $n * $n; }, $numbers);
array_filter
:使用回调函数过滤数组中的元素。
$adults = array_filter($users, function($user) { return $user['age'] >= 18; });
2.1 引用传递与值传递
解析:默认情况下,PHP中的数组是通过值传递的,即函数接收的是数组的一个副本。但可以使用&
符号实现引用传递。
function modifyArrayByValue(&$arr) {
$arr[] = 'new item';
}
$myArray = ['a', 'b', 'c'];
modifyArrayByValue($myArray); // 通过引用传递,$myArray被修改
print_r($myArray); // 输出 ['a', 'b', 'c', 'new item']
function modifyArrayByValueCopy($arr) {
$arr[] = 'new item'; // 这里的修改不会反映到原始数组上
}
$myArrayCopy = ['a', 'b', 'c'];
modifyArrayByValueCopy($myArrayCopy);
print_r($myArrayCopy); // 输出 ['a', 'b', 'c']
2.2 数组排序与搜索
解析:
sort()
(升序)、rsort()
(降序,保留键名不变)、asort()
(关联数组升序,保持索引关系)、arsort()
(关联数组降序,保持索引关系)等。
sort($numbers); // 对$numbers数组进行升序排序
rsort($numbers); // 对$numbers数组进行降序排序,但注意索引会重新分配
in_array()
(检查数组中是否存在某个值)、array_search()
(返回数组中元素的键名)等。
if (in_array('Alice', $users)) {
echo 'Found Alice!';
}
$key = array_search('Alice', array_column($users, 'name')); // 使用array_column配合搜索关联数组中的值
if ($key !== false) {
echo "Alice's key is $key";
}
3.1 类的定义与实例化
解析:
class Person {
public $name;
public $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function greet() {
echo "Hello, my name is {$this->name} and I am {$this->age} years old.";
}
}
$alice = new Person('Alice', 30);
$alice->greet(); // 输出:Hello, my name is Alice and I am 30 years old.
3.2 访问修饰符与封装
解析:
public
:类外部、子类均可访问。protected
:类外部不可访问,但子类可访问。private
:仅类内部可访问。封装是面向对象编程的核心概念之一,通过访问修饰符控制对类成员(属性和方法)的访问,隐藏内部实现细节,提供公共接口与外界交互。
3.3 继承与多态
解析:
继承允许我们基于一个已存在的类来定义一个新的类,称为子类或派生类。子类继承父类的属性和方法,并可以添加新的属性或重写已有的方法。
class Employee extends Person {
public $department;
function __construct($name, $age, $department) {
parent::__construct($name, $age); // 调用父类的构造器
$this->department = $department;
}
function work() {
echo "Working in {$this->department}.";
}
}
$bob = new Employee('Bob', 25, 'IT');
$bob->greet(); // 继承自Person的方法
$bob->work(); // Employee类特有的方法
多态性是指允许不同类的对象对同一消息作出响应。在PHP中,多态通常通过接口(Interface)和抽象类(Abstract Class)实现。
4.1 数组与对象的混合使用
解析:
class EmployeeManager {
private $employees = [];
function addEmployee($id, $name, $age) {
$this->employees[$id] = ['name' => $name, 'age' => $age];
}
function deleteEmployee($id) {
if (isset($this->employees[$id])) {
unset($this->employees[$id]);
return true;
}
return false;
}
function updateEmployee($id, $data) {
if (isset($this->employees[$id])) {
$this->employees[$id] = array_merge($this->employees[$id], $data);
return true;
}
return false;
}
function getEmployee($id) {
return isset($this->employees[$id]) ? $this->employees[$id] : null;
}
}
// 使用示例
$manager = new EmployeeManager();
$manager->addEmployee(1, 'Alice', 30);
print_r($manager->getEmployee(1)); // 输出员工Alice的信息
通过以上内容的详细解析,我们不仅回顾了PHP中数组与对象的基础知识,还深入探讨了它们的高级特性及在实际编程中的应用。希望这些内容能够帮助读者在面试中更加自信地应对相关问题,同时也在日常工作中更加灵活地运用PHP数组与对象。