2016-02-14 129 views
2

这不是一个关于特定问题的问题,而是一个问题寻求建议和/或援助。PHP OOP构建explination不清楚

我是个二年级的学生,我真的努力获得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(), "."; 

我的问题

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

回答

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

这无疑变得比传入标量更加有用,但希望它说明了什么构造可以做更好一点。无论何时从类中实例化新对象,都会自动调用构造函数。如果您有任何问题,请告诉我。

+0

感谢罗从我的部分语法错误是拼写错误(没有做一个复制和粘贴),但我得到你在说什么,非常感谢你花时间帮助我 –

+0

很高兴帮助@TimothyCoetzee,好在你的学习中运气好! –

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 

第二种方法是最好的方法。

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 { private $ 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数组中的数据(作为参数传递)存储在该实例中。与作者给出的第一个例子相同。