PHP OOP 构造解释不清楚


PHP OOP Construct explination unclear

这不是一个关于特定问题的问题,而是一个寻求建议和/或帮助的问题。

是一名二年级学生,我真的很努力掌握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 进行属性声明,而是声明它们的作用域(publicprivateprotected 等(,还有一些语法错误(缺少分号(,但那是另一天。

清楚的是,如果他们实际上使用了构造函数的新功能,但由于某种原因,他们没有。下面是实际使用构造函数的更新示例:

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 AnetAPI'CustomerAddressType();
    $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实例中。与作者给出的第一个示例相同。