PHP中的对象
对象和类
<?php
// 类是用于生成一个或多个对象的代码模板
// 使用 class 关键字和任意类名来声明
// 类名可以是任意字母和数字 但是不能以数学开头
class ShopProduct
{
// 类本体
// 尽管ShopProduct类没有任何用处 但是它已经是一个合法的类了
}
// 一个(或两个)对象
// 既然类是对象生成的模板 那么接下来就创建对象了
// 创建对象 就是实例化 类
$product1 = new ShopProduct();
$product2 = new ShopProduct();
// 尽管 product1 product2 在功能上对等的(都是空的) 但是它们是由同一个类创建的,具有相同类型的不同对象
var_dump($product1);
var_dump($product2);结果
object(ShopProduct)#1 (0) {
}
object(ShopProduct)#2 (0) {
}设置类中的属性
<?php
// 类是用于生成一个或多个对象的代码模板
// 使用 class 关键字和任意类名来声明
// 类名可以是任意字母和数字 但是不能以数学开头
class ShopProduct
{
// ---------属性---------
// 我们可以在类中定义被称为“属性”的特殊变量
// 属性也被称为“成员变量” 用于保存在各个对象中不同的数据
// 以ShopProduct对象为例 其中会有“商品名称”和“价格”等字段
// 除了在声明它们时必须指定可见性关键字 类中的属性与普通变量看起来非常相似
// 关键字可以是 public protected private 它确定了属性能够被访问的作用域
// 我们定义了四个属性 并分别给它们赋予了默认值
// 现在 任何从ShopProduct类中实例化的对象都会被这些默认值初始化
// 各个属性都是以 public 关键字声明的 可以确保从对象外部访问这些属性
public $title = 'default product';
public $producerMainName = 'main name';
public $producerFirstName = 'first name';
public $price = 0;
}
// 一个(或两个)对象
// 既然类是对象生成的模板 那么接下来就创建对象了
// 创建对象 就是实例化 类
// $product1 = new ShopProduct();
// 可以使用字符“->”(对象运算符)连接对象变量和属性名来访问属性变量
// print $product1->title;
// 由于属性被定义成 public 所以既可以读取它们的默认值 也可以赋值给它们 覆盖掉类中设置的默认值
$product1 = new ShopProduct();
$product2 = new ShopProduct();
$product1->title = 'My Antonia';
$product2->title = 'Catch 22';
print $product1->title;
print '<br/>';
print $product2->title;结果
My Antonia
Catch 22使用方法
<?php
// 类是用于生成一个或多个对象的代码模板
// 使用 class 关键字和任意类名来声明
// 类名可以是任意字母和数字 但是不能以数学开头
class ShopProduct
{
// ---------属性---------
// 我们可以在类中定义被称为“属性”的特殊变量
// 属性也被称为“成员变量” 用于保存在各个对象中不同的数据
// 以ShopProduct对象为例 其中会有“商品名称”和“价格”等字段
// 除了在声明它们时必须指定可见性关键字 类中的属性与普通变量看起来非常相似
// 关键字可以是 public protected private 它确定了属性能够被访问的作用域
// 我们定义了四个属性 并分别给它们赋予了默认值
// 现在 任何从ShopProduct类中实例化的对象都会被这些默认值初始化
// 各个属性都是以 public 关键字声明的 可以确保从对象外部访问这些属性
public $title = 'default product';
public $producerMainName = 'main name';
public $producerFirstName = 'first name';
public $price = 0;
// ----------方法---------
// 方法就是在类中定义的特殊函数
// 方法的声明和函数的声明相似 在关键字 function 接方法名
// 与属性一样 方法也可以被声明为 public protected 或 private
// 如果在方法的声明中省略了可见性关键字 那么该方法会被隐式地声明为 public
public function getProducer()
{
// 在这个方法内部使用了“伪变量”特性
// $this 伪变量是一种让类引用自己的对象实例的方式
// 如果难以理解 可以用“当前实例”来替换 $this
// 即 当前实例的 $producerFirstName 属性
return $this->producerFirstName . ' ' . $this->producerMainName;
}
}
// 与调用函数一样 即使不传递任何参数给方法 调用方法时也必须加上一对圆括号
$product1 = new ShopProduct();
$product1->title = 'My Antonia';
$product1->producerMainName = 'Cather';
$product1->producerFirstName = 'Willa';
$product1->price = 5.99;
// 如果换成单引号就只是输出字符串了
print "author: {$product1->getProducer()}\n";结果
author: Willa Cather 编写一个构造方法
像上面这样, getProducer 方法会连接 $producerFirstName 和 $producerMainName 属性并返回连接后的值,省去了每次用到制作者全名都要进行处理的麻烦。
这么做只是稍微改善了一下这个类,其中仍然有一些不受欢迎的不确定性。这个类依赖客户端(调用类、函数或方法的代码通常都被称为该类、函数或方法的客户端或客户端代码)来设置对象的属性值,这种方式有两个问题:
- 首先,初始化一个ShopProduct对象需要5行代码,所有人都会觉得非常麻烦
- 其次,ShopProduct对象被初始化时,无法保证所有属性都被设置了值
所以我们需要一个在实例化类的对象时会被自动调用的方法---构造方法(构造函数)
构造方法会在对象被创建时调用。可以使用它进行初始化工作
<?php
// 类是用于生成一个或多个对象的代码模板
// 使用 class 关键字和任意类名来声明
// 类名可以是任意字母和数字 但是不能以数学开头
class ShopProduct
{
// ---------属性---------
// 我们可以在类中定义被称为“属性”的特殊变量
// 属性也被称为“成员变量” 用于保存在各个对象中不同的数据
// 以ShopProduct对象为例 其中会有“商品名称”和“价格”等字段
// 除了在声明它们时必须指定可见性关键字 类中的属性与普通变量看起来非常相似
// 关键字可以是 public protected private 它确定了属性能够被访问的作用域
public $title;
public $producerMainName;
public $producerFirstName;
public $price = 0;
// --------构造函数--------
// 使用 new 运算符创建对象时 __construct() 方法就会被调用
public function __construct(
$title,
$firstName,
$mainName,
$price
)
{
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
}
// ----------方法---------
// 方法就是在类中定义的特殊函数
// 方法的声明和函数的声明相似 在关键字 function 接方法名
// 与属性一样 方法也可以被声明为 public protected 或 private
// 如果在方法的声明中省略了可见性关键字 那么该方法会被隐式地声明为 public
public function getProducer()
{
// 在这个方法内部使用了“伪变量”特性
// $this 伪变量是一种让类引用自己的对象实例的方式
// 如果难以理解 可以用“当前实例”来替换 $this
// 即 当前实例的 $producerFirstName 属性
return $this->producerFirstName . ' ' . $this->producerMainName;
}
}
// 与调用函数一样 即使不传递任何参数给方法 调用方法时也必须加上一对圆括号
$product1 = new ShopProduct(
'My Antonia',
'Willa',
'Cather',
5.99
);
// 如果换成单引号就只是输出字符串了
// getProducer 方法会连接 $producerFirstName 和 $producerMainName 属性并返回连接后的值
// 省去了每次用到制作者全名都要进行处理的麻烦
print "author: {$product1->getProducer()}\n";结果
author: Willa Cather
评论已关闭