PHP OOP构建探索不清楚

时间:2016-02-14 05:59:59

标签: php oop

这不是一个特定问题的问题,而是一个提出建议和/或帮助的问题。

我是一名二年级学生,我真的很难掌握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(UNCLEAR ......?)

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(), ".";

我的问题

我真的想知道上面两个例子有什么区别?此外,如果可以包括一个初学者的实际例子,将非常感谢!

3 个答案:

答案 0 :(得分:2)

难怪你很困惑,这是一个非常糟糕的例子(看起来他们忘了包括将名称传递给构造函数)!此处也有一些过时的样式,通常人们不再使用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(), ".";

这肯定比传递标量更有用,但希望它说明了构造函数可以做得更好一些。每当从类中实例化一个新对象时,都会自动调用构造函数。如果您有任何问题,请告诉我。

答案 1 :(得分:2)

两个类之间的区别在于,您不能一次初始化数据,但在第二个类中,您可以一次初始化数据。

头等舱

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

第二种方式是最佳方式。

答案 2 :(得分:1)

这是一个简单的答案。首先,您似乎在上面的代码中使用了javascript var ,因此我在下面省略了这一点。如您所见, Person 是关注的对象。在上面的例子中,作者只是在Person对象中添加一个名字 - 但是一个人可能有许多其他特征,如年龄,出生日期等......所以当一个person对象被初始化时,Person对象将有一个将$ name存储在内存中的位置。由于$name 属性是私有的,因此上述代码使用setters and getters来设置和获取 $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

class Person {         私人$ 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实例中。与作者给出的第一个例子相同。