2014-10-22 4 views
0

Я пытаюсь создать базовый класс, в котором хранится переменная строки имени. Проблема в том, что функция setName работает некорректно для меня. Я получаю сообщение об ошибке:PHP class setName function

Catchable фатальная ошибка: Метод TesterClass :: __ ToString() должна возвращать значение строки в C: \ XAMPP \ HTDOCS \ CA18 \ testerPage.php на линии 12

Я пробовал много различные способы сделать это, но ничего, кажется, чтобы исправить это: код выглядит следующим образом:

<?php 
 
\t class TesterClass 
 
\t { 
 
\t \t public $name; 
 
\t \t 
 
\t \t public function setName($n) 
 
\t \t { 
 
\t \t \t $name = $n; 
 
\t \t } 
 
\t \t public function __toString() 
 
\t \t { 
 
\t \t \t return $this->name; 
 
\t \t } 
 
\t \t public function __construct() 
 
\t \t { 
 
\t \t \t $numArgs = func_num_args(); 
 
\t \t \t $args = func_get_args(); 
 
\t \t \t if ($numArgs == 0) 
 
\t \t \t { 
 
\t \t \t \t setName($args[0]); 
 
\t \t \t } 
 
\t \t } 
 
\t } 
 
?>

Вот реализация класса:

<!DOCTYPE html> 
 
<html lang="en"> 
 
\t <head> 
 
\t \t <meta charset="utf-8"> 
 
     <title>Payroll</title> \t \t \t 
 
    </head> 
 
    <body> 
 
\t \t <h1>Payroll</h1> 
 
\t \t <?php 
 
\t \t \t require "TesterClass.php"; 
 
\t \t \t $myObject = new TesterClass("Philllip"); 
 
\t \t \t echo $myObject; 
 
\t \t ?> 
 
    </body> 
 
</html>

Спасибо!

+0

Должно ли это быть $ this-> name = $ n в setName? – Hammerstein

ответ

0

ли это:

public function setName($n) 
     { 
      $this->$name = $n; 
     } 

$this представляет любой экземпляр класса ($myObject в вашем случае), а одна $name новая переменная.

Я думаю, что ваш чек также ошибочен.

public function __construct() 
      { 
       $numArgs = func_num_args(); 
       $args = func_get_args(); 
       if ($numArgs == 0)//This condition says that there are no args passed so it should give an error 
       { 
        //no args 
       } 
       else $this->setName($args[0]); 
      } 
0

В setName() вы устанавливаете его в локальную переменную $name не переменную $name в классе ... вам нужно использовать $this->name. Кроме того, необходимо ссылаться на $this->setName() и при проверке на количество арга, вы ищете, когда есть 0 ... вы должны искать, когда есть больше чем 0.

class TesterClass 
{ 
    public $name; 

    public function setName($n) 
    { 
     $this->name = $n; 
    } 
    public function __toString() 
    { 
     return $this->name; 
    } 
    public function __construct() 
    { 
     $numArgs = func_num_args(); 
     $args = func_get_args(); 
     if ($numArgs) 
     { 
      $this->setName($args[0]); 
     } 
    } 
} 
+0

Хорошо, я изменил это, и я все еще вижу ту же ошибку. – cheesebal35

+0

На самом деле я просто понял, там также должно быть $ this-> перед вызовом функции setName(). Спасибо за помощь! – cheesebal35

0
<?php 
class TesterClass 
{ 
    public $name = ''; // make sure this is a string! 

    public function setName($n) 
    { 
     $this->name = $n; 
    } 
    public function __toString() 
    { 
     return $this->name; 
    } 
    public function __construct() 
    { 
     $numArgs = func_num_args(); 
     $args = func_get_args(); 
     if (count($numArgs)) // if there is an arg! 
     { 
      $this->setName($args[0]); // class methods are called with $this! 
     } 
    } 
} 

I не знаете, почему вы используете func_get_args, но вы также можете использовать именованный параметр со значением по умолчанию.

public function __construct($name = '') 
    { 
     $this->setName($name); 
    } 
0

Ваш код

public function setName($n) 
{ 
    $name = $n; 
} 

Но это должно быть

public function setName($n) 
{ 
    $this->name = $n; 
} 

В первом коде, вы устанавливаете локальную переменную область с именем "имя" в функции SetName. В последнем коде вы устанавливаете свойство объекта с именем «имя».

Также вы должны проверить, является ли это допустимым строковым значением, AND, ваше свойство должно иметь значение по умолчанию в строке. В противном случае вы можете получить такую ​​же ошибку, если не задали имя и не пытались получить имя.