Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP构造解释不清楚_Php_Oop - Fatal编程技术网

PHP OOP构造解释不清楚

PHP OOP构造解释不清楚,php,oop,Php,Oop,这不是一个关于特定问题的问题,而是一个寻求建议和/或帮助的问题 我是一名二年级学生,我真的很难掌握OOP编程的诀窍,事实上我的教科书不是很清楚,在它的解释中也没有帮助。我知道网络上有100个这样的例子,可能,但我想特别关注我的教科书中使用的例子。 php中OOP的介绍从以下内容开始: 示例1 class Person{ var $name; function set_name($data){ $this->name=$data; } function get_name(){

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

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

我的问题


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

难怪您会感到困惑,这是一个非常糟糕的示例(看起来他们忘记了将名称传递给构造函数)!这里也有一些过时的样式,通常人们不再使用
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对象将有一个位置将其$name存储在内存中。由于
$name
属性是私有的,因此上面的代码用于设置和获取
$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()
的实例,并将来自用户数组(作为参数传递)的数据存储在该
CustomerAddressType
实例中。与作者给出的第一个示例相同。

谢谢Rob,语法错误是我的部分的输入错误(没有进行复制和粘贴)但我明白你的意思,非常感谢你花时间帮助我
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;
}