PHP 面向对象编程(OOP)是一种编程范式,它使用对象和类来组织代码。PHP 面向对象技术包括以下几个核心概念和特性:
通过 class
关键字定义类。
class MyClass {
// 属性和方法
}
对象是类的实例。通过 new
关键字创建对象。
$obj = new MyClass();
属性可以是公共的(public
)、私有的(private
)或受保护的(protected
)。
class MyClass {
public $publicProperty;
private $privateProperty;
protected $protectedProperty;
}
方法也可以是公共的、私有的或受保护的。
class MyClass {
public function publicMethod() {
// 方法体
}
private function privateMethod() {
// 方法体
}
}
在 PHP 中,构造函数使用 __construct()
方法定义。
class MyClass {
public function __construct() {
echo "对象已创建!";
}
}
在 PHP 中,析构函数使用 __destruct()
方法定义。
class MyClass {
public function __destruct() {
echo "对象已销毁!";
}
}
使用 extends
关键字实现继承。
class ParentClass {
public function parentMethod() {
echo "父类方法";
}
}
class ChildClass extends ParentClass {
public function childMethod() {
echo "子类方法";
}
}
public
:可以在任何地方访问。private
:只能在类内部访问。protected
:可以在类内部和子类中访问。static
关键字定义静态属性和方法。通过 ::
运算符访问静态属性和方法。
class MyClass {
public static $staticProperty = "静态属性";
public static function staticMethod() {
echo "静态方法";
}
}
echo MyClass::$staticProperty;
MyClass::staticMethod();
abstract
关键字定义抽象类。抽象类可以包含抽象方法和具体方法。
abstract class AbstractClass {
abstract public function abstractMethod();
public function concreteMethod() {
echo "具体方法";
}
}
interface
关键字定义接口。使用 implements
关键字实现接口。
interface MyInterface {
public function interfaceMethod();
}
class MyClass implements MyInterface {
public function interfaceMethod() {
echo "接口方法实现";
}
}
trait
关键字定义 Trait。使用 use
关键字在类中引入 Trait。
trait MyTrait {
public function traitMethod() {
echo "Trait 方法";
}
}
class MyClass {
use MyTrait;
}
__
开头。常见的魔术方法包括 __construct()
、__destruct()
、__get()
、__set()
、__call()
等。
class MyClass {
public function __get($name) {
echo "访问未定义的属性: $name";
}
public function __set($name, $value) {
echo "设置未定义的属性: $name = $value";
}
}
使用 namespace
关键字定义命名空间。
namespace MyNamespace;
class MyClass {
// 类定义
}
include
或 require
。使用 spl_autoload_register()
函数注册自动加载函数。
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
PHP 7 引入了标量类型声明和返回类型声明,允许在方法和函数中指定参数和返回值的类型。
function add(int $a, int $b): int {
return $a + $b;
}
使用 new class
语法创建匿名类。
$obj = new class {
public function sayHello() {
echo "Hello, World!";
}
};
$obj->sayHello();
final
关键字用于防止类被继承或方法被重写。
final class FinalClass {
final public function finalMethod() {
echo "最终方法";
}
}
使用 __clone()
魔术方法自定义克隆行为。
class MyClass {
public function __clone() {
echo "对象已被克隆";
}
}
$obj1 = new MyClass();
$obj2 = clone $obj1;
==
和 ===
运算符来比较对象。==
比较对象的内容是否相同。===
比较对象是否是同一个实例。
$obj1 = new MyClass();
$obj2 = new MyClass();
$obj3 = $obj1;
var_dump($obj1 == $obj2); // true
var_dump($obj1 === $obj2); // false
var_dump($obj1 === $obj3); // true
使用 serialize()
和 unserialize()
函数进行序列化和反序列化。
$obj = new MyClass();
$serialized = serialize($obj);
$unserialized = unserialize($serialized);
对象可以通过 foreach
循环进行迭代,前提是类实现了 Iterator
接口。
class MyClass implements Iterator {
private $position = 0;
private $array = ['first', 'second', 'third'];
public function rewind() {
$this->position = 0;
}
public function current() {
return $this->array[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->array[$this->position]);
}
}
$obj = new MyClass();
foreach ($obj as $key => $value) {
echo "$key: $value\n";
}
使用 interface
关键字定义接口。
interface MyInterface {
public function doSomething();
}
class MyClass implements MyInterface {
public function doSomething() {
echo "Doing something";
}
}
通过接口或父类引用调用方法时,实际执行的是子类或实现类的方法。
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
echo "Woof!";
}
}
class Cat implements Animal {
public function makeSound() {
echo "Meow!";
}
}
function makeSound(Animal $animal) {
$animal->makeSound();
}
makeSound(new Dog()); // Woof!
makeSound(new Cat()); // Meow!
使用 ReflectionClass
类进行反射操作。
$reflection = new ReflectionClass('MyClass');
$methods = $reflection->getMethods();
foreach ($methods as $method) {
echo $method->getName() . "\n";
}
==
和 ===
运算符来比较对象。==
比较对象的内容是否相同。===
比较对象是否是同一个实例。
$obj1 = new MyClass();
$obj2 = new MyClass();
$obj3 = $obj1;
var_dump($obj1 == $obj2); // true
var_dump($obj1 === $obj2); // false
var_dump($obj1 === $obj3); // true
使用 serialize()
和 unserialize()
函数进行序列化和反序列化。
$obj = new MyClass();
$serialized = serialize($obj);
$unserialized = unserialize($serialized);
对象可以通过 foreach
循环进行迭代,前提是类实现了 Iterator
接口。
class MyClass implements Iterator {
private $position = 0;
private $array = ['first', 'second', 'third'];
public function rewind() {
$this->position = 0;
}
public function current() {
return $this->array[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->array[$this->position]);
}
}
$obj = new MyClass();
foreach ($obj as $key => $value) {
echo "$key: $value\n";
}
使用 interface
关键字定义接口。
interface MyInterface {
public function doSomething();
}
class MyClass implements MyInterface {
public function doSomething() {
echo "Doing something";
}
}
通过接口或父类引用调用方法时,实际执行的是子类或实现类的方法。
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
echo "Woof!";
}
}
class Cat implements Animal {
public function makeSound() {
echo "Meow!";
}
}
function makeSound(Animal $animal) {
$animal->makeSound();
}
makeSound(new Dog()); // Woof!
makeSound(new Cat()); // Meow!
使用 ReflectionClass
类进行反射操作。
$reflection = new ReflectionClass('MyClass');
$methods = $reflection->getMethods();
foreach ($methods as $method) {
echo $method->getName() . "\n";
}
==
和 ===
运算符来比较对象。==
比较对象的内容是否相同。===
比较对象是否是同一个实例。
$obj1 = new MyClass();
$obj2 = new MyClass();
$obj3 = $obj1;
var_dump($obj1 == $obj2); // true
var_dump($obj1 === $obj2); // false
var_dump($obj1 === $obj3); // true
使用 serialize()
和 unserialize()
函数进行序列化和反序列化。
$obj = new MyClass();
$serialized = serialize($obj);
$unserialized = unserialize($serialized);
对象可以通过 foreach
循环进行迭代,前提是类实现了 Iterator
接口。
class MyClass implements Iterator {
private $position = 0;
private $array = ['first', 'second', 'third'];
public function rewind() {
$this->position = 0;
}
public function current() {
return $this->array[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->array[$this->position]);
}
}
$obj = new MyClass();
foreach ($obj as $key => $value) {
echo "$key: $value\n";
}
使用 interface
关键字定义接口。
interface MyInterface {
public function doSomething();
}
class MyClass implements MyInterface {
public function doSomething() {
echo "Doing something";
}
}
通过接口或父类引用调用方法时,实际执行的是子类或实现类的方法。
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
echo "Woof!";
}
}
class Cat implements Animal {
public function makeSound() {
echo "Meow!";
}
}
function makeSound(Animal $animal) {
$animal->makeSound();
}
makeSound(new Dog()); // Woof!
makeSound(new Cat()); // Meow!
使用 ReflectionClass
类进行反射操作。
$reflection = new ReflectionClass('MyClass');
$methods = $reflection->getMethods();
foreach ($methods as $method) {
echo $method->getName() . "\n";
}
==
和 ===
运算符来比较对象。==
比较对象的内容是否相同。===
比较对象是否是同一个实例。
$obj1 = new MyClass();
$obj2 = new MyClass();
$obj3 = $obj1;
var_dump($obj1 == $obj2); // true
var_dump($obj1 === $obj2); // false
var_dump($obj1 === $obj3); // true
serialize()
和 `