PHP面向对象编程最详讲解和例子
面向对象编程是一种使用对象和类的编程方法。如今,Java 和C++主要用于面向对象编程。PHP4中面向对象编程的范围有限,但在PHP5中,对象模型被重写以获得更好的性能和更多功能。现在PHP5拥有完整的对象模型。接下来sojson继续给大家讲解。
什么是对象?
面向对象语言背后的基本思想是将一组变量和函数封装到一个单元中,并保持变量和函数免受外部干扰和误用。这样的单元称为作用于数据的对象。将数据和函数绑定在一起的机制称为封装。此功能可以轻松地在各种项目中重用代码。对象中声明的函数提供了访问数据的方式。对象的功能称为方法,对象的所有方法都可以访问称为属性的变量。
下图显示了一个对象的组成部分。
班级
在面向对象编程中,类是创建对象的构造或原型。类定义了使类实例具有状态和行为的组成成员。数据字段成员使类对象能够维护状态,方法使类对象能够执行行为。下图显示了一个类的组件。
PHP:创建类和实例化
-类定义以关键字class开头,后跟类名,然后是一组花括号 ( {} ),其中包含属于该类的常量、变量(称为“属性”)和函数(称为“方法”) 。
-有效的类名(不包括保留字)以字母或下划线开头,后跟任意数量的字母、数字或下划线。
-类名通常以大写字母开头,以区别于其他标识符。
-实例是从现有类创建的对象。
-从现有类创建对象称为实例化对象。
-要从类中创建对象, 必须使用new关键字。
-类应该在实例化之前定义。
例子:
在下面的示例中,关键字new用于实例化对象。这里$myobj代表Myclass类的一个对象。
让我们使用 var_dump() 函数查看 Myclass 类的内容(显示有关一个或多个变量的结构化信息(类型和值)):
输出:
object(Myclass)#1 (0) { }
设置属性
类成员变量称为属性。有时它们被称为属性或字段。
这些属性保存特定数据并与定义它的类相关。
在类中声明属性是一项简单的任务,使用关键字 public、protected 或 private 之一,后跟普通变量声明。如果使用 var 声明(与 PHP 4 兼容),该属性将被定义为 public。
public :可以通过脚本或从另一个类从类外部访问该属性
private :无论是通过脚本还是从另一个类,都不会从类外部授予访问权限。
protected :除了具有受保护属性或方法的类的子类之外,不会从类外部授予任何访问权限。
nowdocs(从 PHP 5.3.0 开始)可以在任何静态数据上下文中使用,包括属性声明。
例子:
实例化对象后,可以使用对象和->运算符访问类的属性。任何用关键字“private”或“protected”声明的成员都不能在类的方法之外访问。
font_size;
?>
输出:
10
实例化对象后,可以使用对象和->运算符访问类的属性。任何用关键字“private”或“protected”声明的成员都不能在类的方法之外访问。
注意:访问变量时使用多个美元符号是一个常见的错误。在上面的示例中,font_size 之前不会有 $ 符号(echo $f->font_size)。
定义方法后,我们将讨论公共、私有和受保护类属性的示例。
设置方法
-在类中声明的函数称为方法。
-类方法与 PHP 函数完全相同。
-在类中声明方法是一项简单的任务,使用关键字 public、protected 或 private 之一,后跟方法名称。
-public :该方法可以从类外部访问。
-private :不允许从类外部授予访问权限。
-protected :除了具有受保护属性或方法的类的子类之外,不会从类外部授予任何访问权限。
-有效的方法名称以字母或下划线开头,后跟任意数量的字母、数字或下划线。
-方法体括在一对大括号内,其中包含代码。左大括号 ( { ) 指示方法代码的开始,右大括号 ( } ) 指示方法的终止。
-如果该方法不是由 public、protected 或 private 定义的,则默认为 public。
-对于非静态属性,可以使用 $this(格式 $this->property)访问当前实例的属性和方法。
例子:
实例化对象后,可以使用对象和->运算符访问类的方法。在下面的示例中,customize_print() 方法将借助 php echo 语句在 html 段落元素中打印具有特定字体大小和颜色的字符串。
font_size.";color:".$this->font_color.";>".$this->string_name."";
}
}
$f = new MyClass;
echo $f->customize_print();
?>
输出:
w3resource
现在更改 font_size、font_color 和字符串的值并检查custimize_print()方法返回的内容。
font_size.";color:".$this->font_color.";>".$this->string_name."";
}
}
$f = new MyClass;
$f->font_size = "20px";
$f->font_color = "red";
$f->string_name = "Object Oriented Programming";
echo $f->customize_print();
?>
输出:
Object Oriented Programming
PHP:范围解析运算符 (::)
在 PHP 中,作用域解析运算符也称为 Paamayim Nekudotayim,希伯来语的意思是“双冒号”或“双点两次”。双冒号(::)是一个标记,允许访问类的静态、常量和重写的属性或方法。
PHP:类常量
-一个特殊的实体,在各个类别的基础上保持固定。
-常量名称不像普通变量声明那样以美元符号 ($) 开头。
-接口还可以包括常量。
-当使用 $classname :: constant 语法调用类常量时,类名实际上可以是一个变量。
-从 PHP 5.3 开始,您可以使用变量引用访问静态类常量(示例:className :: $varConstant)。
定义和使用常量
";
}
}
echo MyClass::constant1 . "
";
$classname = "MyClass";
echo $classname::constant1 . "
"; // As of PHP 5.3.0
$class = new MyClass();
$class->PrintConstant();
echo $class::constant1."
"; // As of PHP 5.3.0
?>
了解公共、私有、受保护的财产
属性可以是公共的、私有的或受保护的。Public 意味着属性可以在任何地方访问,private 意味着属性可以由定义成员的类访问,protected 意味着属性只能在类本身内部以及继承类和父类中访问。
例子:
font_size;
echo $this->font_color;
echo $this->string_name;
}
}
$obj = new MyClass;
echo $obj->font_size; //Display 18px
echo $obj->font_color; //Fatal error: Cannot access private property Myclass::$font_color in F:\wamp\..
echo $obj->string_name; //Fatal error: Cannot access protected property Myclass::$string_name in F:\wamp\..
$obj->property_print(); //Display 18pxbluew3resource
?>
了解公共、私有、受保护的方法
方法可以是公共的、私有的或受保护的。public 意味着方法可以在任何地方访问,private 意味着方法可以由定义成员的类访问,protected 意味着方法只能在类本身内部以及继承类和父类访问。
my_public_method();
$this->my_private_method();
$this->my_protected_method();
}
}
$obj = new MyClass;
$obj->my_public_method(); //Display This is a Public method
$obj->my_private_method();//Fatal error: Call to private method Myclass::my_private_method() from context '' in F:\wamp\www..
$obj>my_protected_method();//Fatal error: Call to undefined function my_protected_method() in F:\wamp\www..
$obj->test(); //Display This is a Public methodThis is a Private methodThis is a Protected method
?>
注意: PHP 在其对象模型中使用继承,当您扩展一个类时,子类将从父类继承所有公共和受保护的方法。当我们讨论继承时,您将获得有关受保护的属性和方法的更多信息。
PHP 构造方法
构造函数是 PHP 5 中添加的一个特殊的内置方法,允许开发人员为类进行声明。
构造函数允许在创建对象时初始化对象属性(即属性的值)。
具有构造函数方法的类在创建对象时会自动执行。
'construct' 方法以两个下划线 (__) 开头。
如果您不想在创建对象时传递任何属性值或执行任何操作,则不需要构造函数。
PHP 只调用一个构造函数。
构造函数声明的一般语法如下:
function __construct([argument1, argument2, ..., argumentN])
{
/* 类初始化代码 */
}
argument1、argument2、......、argumentN 的类型是混合的。
例子:
font_size = $font_size;
$this->font_color = $font_color;
$this->string_value = $string_value;
}
// Declare a method for customize print
function customize_print()
{
echo "font_size.";color:".$this->font_color.";>".$this->string_value."
";
}
}
// Create a new object and passes three parameters
$f = new MyClass('20px','red','Object Oriented Programming');
// Call the method to display the string
echo $f->customize_print();
?>
输出:
Object Oriented Programming
PHP 析构函数方法
析构函数是构造函数的对应部分。
当对象被销毁时,会调用析构函数
析构函数在对象被销毁后清理分配给该对象的所有资源。
析构函数通常以两种方式调用:当脚本结束时或使用 unset() 函数手动删除对象时
“析构函数”方法以两个下划线 (__) 开头。
析构函数声明的一般语法如下:
function __destruct
{
/* 类初始化代码 */
}
argument1、argument2、......、argumentN 的类型是混合的。
例子:
';
$this->name = "MyClass";
}
function __destruct()
{
echo "Destroying " . $this->name . "
";
}
}
$obj = new MyClass();
?>
输出:
w3resource
Destroying MyClass
PHP:使用同一类的多个实例
在下面的示例中,我们创建了同一类的多个对象(实例)并传递不同的值。
font_size = $font_size;
$this->font_color = $font_color;
$this->string_value = $string_value;
$this->customize_print();
}
// Declare a method for customize print
function customize_print()
{
echo "font_size.";color:".$this->font_color.";>".$this->string_value."
";
}
}
// Create first object and passes three parameters
$a = new MyClass('30px','red','Object Oriented Programming');
// Create second object and passes three parameters
$b = new MyClass('25px','blue','Object Oriented Programming');
// Create third object and passes three parameters
$c = new MyClass('20px','green','Object Oriented Programming');
// Create fourth object and passes three parameters
$d = new MyClass('15px','black','Object Oriented Programming');
?>
PHP:spl_autoload_register()
许多编写面向对象应用程序的开发人员为每个类定义创建一个 PHP 源文件。最大的烦恼之一是必须在每个脚本的开头编写一长串所需的包含内容(每个类一个)。传统上,__autoload() 函数用于自动加载类。从 PHP 5.1.2 开始,引入了新函数 spl_autoload_register(),它为自动加载类提供了更灵活的替代方法。因此,不鼓励使用 __autoload(),并且将来可能会弃用或删除。
句法:
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
范围
姓名 | 描述 |
---|---|
自动加载函数 | 正在注册自动加载功能。如果未提供参数,则将注册 spl_autoload() 的默认实现。 |
扔 | 该参数指定当 autoload_function 无法注册时 spl_autoload_register() 是否应抛出异常。 |
前置 | 如果为 true,spl_autoload_register() 会将自动加载器添加到自动加载堆栈的前面,而不是附加它。 |
返回值
成功则返回 TRUE,失败则返回 FALSE。
您可以通过以下方式使用 spl_autoload_register() 函数:
例子:
首先我们将创建两个类并将它们存储在 /php/classes-objects/resource 路径中:
类1.php
font_color = $font_color;
$this->string_value = $string_value;
$this->customize_print1();
}
// Declare a method for customize print
function customize_print1()
{
echo "font_color.";>".$this->string_value."
";
}
}
?>
类2.php
font_size = $font_size;
$this->string_value = $string_value;
$this->customize_print2();
}
// Declare a method for customize print
function customize_print2()
{
echo "font_size.";>".$this->string_value."
";
}
}
?>
现在,创建一个文件 printstring.php 并将其保存在 /php/classes-objects 中:
在上面的示例中,我们尝试创建两个对象,其中类名“class1”(保存在 /php/classes-objects/resource/class1.php 中)和“class2”(保存在 /php/classes-objects/resource/ 中)类2.php)。PHP 将此名称作为字符串传递给 spl_autoload_register(),这允许您获取该变量并使用它来“包含”适当的类/文件。
PHP:继承
-继承是一个完善的编程原则。
-继承使类能够形成像家谱一样的层次结构。
-允许子类共享其超类的方法和属性(公共的或受保护的)。
-超类是父类。
-子类可以添加属性和方法。
-继承允许重用代码。
例子:
在下面的示例子类中,“Mysubclass”继承了“Myclass”类的所有受保护属性和公共方法。此外,我们在子类“Mysubclass”的 echo 语句中添加了一个文本装饰属性。
font_size = $font_size;
$this->font_color = $font_color;
$this->string_value = $string_value;
$this->customize_print();
}
// Declare a method for customize print
public function customize_print()
{
echo "font_size.";color:".$this->font_color.";>".$this->string_value."
";
}
}
// Define a subclass
class Mysubclass extends Myclass
{
// Call the method customize print() and add the text decoration attribute within echo statement
public function customize_print()
{
echo "font_size.";color:".$this->font_color.";text-decoration:underline;>".$this->string_value."
";
}
}
// Create objects and passes parameters
$p = new Myclass('20px','red','Object Oriented Programming');
$s = new Mysubclass('15px','green','Object Oriented Programming');
?>
PHP:接口
提供了实现方法。
派生类可以实现多个接口。
接口可以使用 extends 关键字从其他接口继承。
接口定义中的所有方法都假定为公共的,可以显式定义为公共或隐式。
当一个类实现多个接口时,不同接口中定义的方法之间不能出现任何命名冲突。
句法:
interface MyInterface
{
function method1();
function method2();
}
class MyClass implements MyInterface
{
function method1()
{
// definition of method1
}
function method2()
{
// definition of method2
}
}
PHP:对象克隆
克隆用于创建对象的副本。
使用clone关键字创建对象副本。
当克隆一个对象时,PHP 5 将执行该对象所有属性的浅表复制。
任何引用其他变量的属性都将保留引用。
PHP 提供了一个特殊的方法 __clone 来复制对象。
克隆完成后,如果定义了 __clone() 方法,则将调用新创建的对象的 __clone() 方法,以允许需要更改的任何必要属性。
例子:
在 PHP 中,对象克隆是使用clone关键字完成的。这是对象克隆的示例:
示例:使用魔术方法 __clone 进行对象克隆
x = $x;
$this->
y = $y;
}
function __clone()
{
$this->x = "z";
}
}
$a = new MyClass("w3resource", "com"); // create a new object
$b = clone $a; //clone of the object
var_dump($a);
echo '
';
var_dump($b);
?>
输出:
object(MyClass)#1 (2) { ["x"]=> string(10) "w3resource" ["y":"MyClass":private]=> string(3) "com" }
object(MyClass)#2 (2) { ["x"]=> string(1) "z" ["y":"MyClass":private]=> string(3) "com" }
PHP:魔法方法
函数名称 __construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke() 、 __set_state() 和 __clone() 在 PHP 类中很神奇。PHP 保留所有以 __ 开头的函数名称作为魔法。
我们已经讨论过 __construct()、__destruct() 和 __clone() 方法。
以下是其他神奇方法:
__称呼()
当调用对象上下文中不可访问的方法时,会触发 __call() 。
语法: public mix __call ( string $name , array $arguments )
__callStatic()
当在静态上下文中调用不可访问的方法时,会触发 __callStatic()。
语法: public mix __call ( string $name , array $arguments )
__得到()
__get() 用于从不可访问的属性中读取数据。
语法: public mix __get ( string $name )
__放()
__set() 在将数据写入不可访问的属性时运行。
语法:public void __set(字符串$name,混合$value)
__isset()
__isset() 通过对不可访问的属性调用 isset() 或empty() 来触发。
语法:public bool __isset ( string $name )
__unset()
当 unset() 用于不可访问的属性时,会调用 __unset()。
语法: public void __unset ( string $name )
__睡觉()
__sleep() 用于提交待处理的数据或执行类似的清理任务。此外,如果您有不需要完全保存的非常大的对象,该功能也很有用。
语法:公共数组 __sleep (void)
__醒来()
__wakeup() 用于重新建立序列化期间可能丢失的任何数据库连接并执行其他重新初始化任务。
语法:void __wakeup (void)
__toString()
__toString() 方法允许类决定当它被视为字符串时它将如何反应。
语法:公共字符串 __toString (void)
__调用()
当脚本尝试将对象作为函数调用时,将调用 __invoke() 方法。
语法:混合 __invoke ([ $... ] )
__set_state()
自 PHP 5.1.0 起,由 var_export() 导出的类会调用此静态方法。
语法:静态对象__set_state(数组$properties)
我们很快将提供一些魔术方法的示例。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/509.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。