这不是一个关于特定问题的问题,而是一个寻求建议和/或帮助的问题。
我是一名二年级学生,我真的很努力掌握OOP编程的窍门,事实上我的教科书不是很清楚,在它的解释中也没有帮助。我知道网络上可能有 100 个例子,但我想特别关注我的教科书中使用的示例。
在 php 中对 OOP 的介绍是这样开始的:例 1
class Person{
var $name;
function set_name($data){
$this->name=$data;
}
function get_name(){
return $this->name;
}
}
$ralph = new Person;
$ralph->set_name('Ralph');
echo 'friend name is '.$ralph->get_name();
很好,我明白没问题,但是它接着给出,在我看来,对构造函数的非常简短的解释是什么,说:
如果你可以同时创建和初始化一个对象,那不是很好吗,PHP 允许你用构造函数做到这一点。
然后继续给出以下示例示例2(不清楚...?
class Person{
var $name;
function __construct($data)
{
$this->name=$data
}
function set_name($data){
$this->name=$data;
}
function get_name(){
return $this->name;
}
}
$dan = new Person;
echo"Friend name is ", $dan->get_name(), ".";
我的问题
我真的很想知道上面的两个例子有什么区别?此外,如果可以包括初学者的实际示例,将不胜感激!
难怪你会感到困惑,这是一个非常糟糕的例子(看起来他们忘记将名称传递给构造函数(!这里也有一些过时的样式,通常人们不再使用 var
进行属性声明,而是声明它们的作用域(public
、private
、protected
等(,还有一些语法错误(缺少分号(,但那是另一天。
清楚的是,如果他们实际上使用了构造函数的新功能,但由于某种原因,他们没有。下面是实际使用构造函数的更新示例:
class Person{
private $name;
function __construct($data)
{
$this->name=$data;
}
function set_name($data){
$this->name=$data;
}
function get_name(){
return $this->name;
}
}
// pass the name to the constructor and you can bypass the set_name call
$dan = new Person("Timothy");
echo "Friend name is ", $dan->get_name(), ".";
这肯定比传递标量有用得多,但希望它说明了构造函数可以做得更好一点。每当从类实例化新对象时,都会自动调用构造函数。如果您有任何问题,请告诉我。
两个类之间的区别是第一个类你不能一次初始化数据,但在第二个类中你可以一次初始化数据。
头等舱
class Person{
private $name;
function set_name($data){
$this->name=$data;
}
function get_name(){
return $this->name;
}
}
$ralph = new Person; // you can not initialize value here
$ralph->set_name('Ralph');
echo 'friend name is '.$ralph->get_name(); //friend name is Ralph
二等舱
class Person{
private $name;
function __construct($data)
{
$this->name=$data
}
function set_name($data){
$this->name=$data;
}
function get_name(){
return $this->name;
}
}
$dan = new Person('Sahadat'); //you can initialize value here
echo"Friend name is ", $dan->get_name(), "."; //Friend name is Sahadat
$dan->set_name('John');
echo"Friend name is ", $dan->get_name(), "."; //Friend name is John
第二种方式是最好的方式。
这是一个简单的答案。首先,您似乎在上面的代码中使用了javascript var
,所以我在下面省略了它。如您所见, Person
是关注的对象。在上面的示例中,作者只向 Person 对象添加一个名称 - 但一个人可能具有许多其他特征,例如年龄、出生日期等......因此,当初始化 person 对象时,Person 对象将有一个位置将其$name存储在内存中。由于 $name
属性是私有的,因此上面的代码使用 setter 和 getter 来设置和获取 $name
属性。
class Person{
private $name;
function setName($name){
$this->name = $name;
}
function getName(){
return $this->name;
}
function setName($name){
$this->name = $name;
}
}
$ralph = new Person;
$ralph->set_name('Ralph');
echo 'friend name is '.$ralph->get_name();
// Friend name is Ralph
第二个示例结合了两个步骤(顺便说一句,您似乎复制了错误的代码段(,对象将接受一个参数 $data
。
类人{ 私人$name;
function __construct($data)
{
$this->name=$data
}
function setName($name){
$this->name=$name;
}
function getName(){
return $this->name;
}
}
$dan = new Person('Dan');
echo"Friend name is ", $dan->get_name(), ".";
//Friend name is Dan
一个真正的面向对象示例应如下所示:
class Person{
private $name;
function __construct($data)
{
$this->name=$data
}
function setName($name){
$this->name=$name;
return $this; // return $this to allow chaining of method calls
}
function getName(){
return $this->name;
}
}
这是额外的,在实际应用程序中,您可以找到类似此示例的内容
public function billTo(array $user){
// Create the Bill To info
$billto = new AnetAPICustomerAddressType();
$billto->setFirstName($user['firstname']);
$billto->setLastName($user['lastname']);
$billto->setCompany($user['company_name']);
$billto->setAddress($user['address']);
$billto->setCity($user['city']);
$billto->setState($user['state']);
$billto->setZip($user['zipcode']);
$billto->setCountry($user['country']);
$billto->setEmail($user['email']);
$billto->setPhoneNumber($user['phone']);
return $billto;
}
上述函数创建类 CustomerAddressType()
的实例,并将来自 User 数组(作为参数传递(的数据存储在该CustomerAddressType
实例中。与作者给出的第一个示例相同。