0

我正在尝试切换到 OOP。我在网上找到了一份由killerphp 编写的pdf,看起来很有用。一直跟着他的例子直到现在,因为我遇到了一个错误。输出是这样的:

警告:person::__construct() 缺少参数 1,在第 15 行的 C:\xampp\htdocs\oop\index.php 中调用并在第 8 行的 C:\xampp\htdocs\oop\class_lib.php 中定义

注意:未定义变量:第 10 行 C:\xampp\htdocs\oop\class_lib.php 中的 people_name

Stefan's full name: Stefan Mischook

Nick's full name: Nick Waddles

这是 index.php(我运行的页面):

<?php
    require_once('class_lib.php');
?>
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>OOP in PHP</title>
</head>

    <body>
        <?php
            // Create object without constructor by calling a method
            $stefan = new person();
            $stefan->set_name("Stefan Mischook");
            echo "Stefan's full name: " . $stefan->get_name();

            echo "<br>";

            // Create object with constructor
            $jimmy = new person("Nick Waddles");
            echo "Nick's full name: " . $jimmy->get_name();

        ?>
    </body>
</html>

这是课程:

<?php
    // A variable inside a class is called a "property"
    // Functions inside a class are called "methods"
    class person
    {
        var $name;

        function __construct($persons_name)
        {
            $this->name = $persons_name;
        }

        function set_name($new_name)
        {
            $this->name = $new_name;
        }

        function get_name()
        {
            return $this->name;
        }
    }

    // $this can be considered a special OO PHP keyword

    // A class is NOT an object. The object gets created when you create an instance of the class.

    // To create an object out of a class you need to use the "new" keyword.

    // When accesign methods and properties of a class you use the -> operator.

    // A constructor is a built-in method that allows you to give your properties values when you create an object
?>

没关系评论,我用它们来学习。非常感谢,如果我需要在降级之前编辑我的问题,请告诉我。干杯!

4

5 回答 5

4

问题在这里:

// Create object without constructor by calling a method
$stefan = new person();                        // <-----
$stefan->set_name("Stefan Mischook");

您没有将必需的参数传递给构造函数。

  function __construct($persons_name)
  {
      $this->name = $persons_name;
  }

这(构造函数)需要一个$persons_name参数来构造person类的新实例。

另外(相关),您的评论// Create object without constructor by calling a method根本不是代码在做什么。您正在调用构造函数,这就是问题所在。也许这是从某些示例中部分复制的,而您错过了什么?

于 2013-11-07T08:19:29.667 回答
2

如果您替换以下行,您的示例将不会出错:

function __construct($persons_name)

对于这个:

function __construct($persons_name='')

所以为对象的构造函数指定一个默认的空字符串。

于 2013-11-07T08:21:17.333 回答
1

试试这个:

$stefan = new person("something");
$stefan->set_name("Stefan Mischook");

最好使用CamelCase作为类名。

于 2013-11-07T08:21:12.677 回答
1

如果您希望能够在没有(某些)参数的情况下调用方法,那么您需要定义它们的默认值。

public function __construct($persons_name = NULL) {
    /* do something with $persons_name */
}

否则,该函数将期望该参数是required并且会产生一个Notice让您知道不正确的函数调用的信息。

于 2013-11-07T08:21:51.013 回答
0

您已指定 __construct 方法/函数。当创建该类的新对象时,它将被调用。现在恰好是这样,您已经说过它需要一个参数,而当您创建该类的对象时却没有给它一个参数。应该是这样的:

$stefan = new person('Stefan Mischook');

以后不需要使用 set_name 方法/函数,除非你想改变它。

您也可以对 __construct 方法/函数执行此操作:

function __construct($persons_name='')

它的作用是自动将 $person_name 分配为空字符串,除非您给它一个参数,在这种情况下,您给出的参数将替换空字符串。

于 2013-11-07T08:20:14.800 回答