这不是一个特定问题的问题,而是一个提出建议和/或帮助的问题。
我是一名二年级学生,我真的很难掌握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(), ".";
我的问题
我真的想知道上面两个例子有什么区别?此外,如果可以包括一个初学者的实际例子,将非常感谢!
答案 0 :(得分:2)
难怪你很困惑,这是一个非常糟糕的例子(看起来他们忘了包括将名称传递给构造函数)!此处也有一些过时的样式,通常人们不再使用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(), ".";
这肯定比传递标量更有用,但希望它说明了构造函数可以做得更好一些。每当从类中实例化一个新对象时,都会自动调用构造函数。如果您有任何问题,请告诉我。
答案 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
实例中。与作者给出的第一个例子相同。