【问题标题】:PHP class setName functionPHP类setName函数
【发布时间】:2014-10-22 16:55:31
【问题描述】:

我正在尝试创建一个存储名称字符串变量的基本类。问题是 setName 函数对我来说不能正常工作。我收到错误:

可捕获的致命错误:方法 TesterClass::__toString() 必须在第 12 行的 C:\xampp\htdocs\CA18\testerPage.php 中返回字符串值

我尝试了很多不同的方法,但似乎没有任何解决方法:代码如下:

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

这是类的实现:

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

谢谢!

【问题讨论】:

  • 不应该是$this->name = $n in setName吗?

标签: php


【解决方案1】:

这样做:

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]);
            }

【讨论】:

    【解决方案2】:

    setName() 中,您将其设置为局部变量$name 而不是类中的$name 变量...您需要使用$this-&gt;name。您还需要引用 $this-&gt;setName() 并且当您检查 args 的数量时,您正在寻找 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]);
            }
        }
    }
    

    【讨论】:

    • 好的,我改变了它,我仍然看到同样的错误
    • 其实我刚刚想通了,在setName()函数调用之前还需要有一个$this->。感谢您的帮助!
    【解决方案3】:
    <?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!
            }
        }
    }
    

    我不知道你为什么使用func_get_args,但你也可以只使用一个命名参数,带有一个默认值。

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

    【讨论】:

      【解决方案4】:

      你的代码是

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

      但应该是的

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

      在第一个代码中,您在 setName 函数中设置了一个名为“name”的局部范围变量。 在最后一个代码中,您正在设置名为“name”的对象属性。

      你还应该检查它是否是一个有效的字符串值,并且你的属性应该有一个字符串默认值。否则,如果您没有设置名称并尝试获取名称,您可能会遇到同样的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 2023-01-05
        • 2022-08-22
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        相关资源
        最近更新 更多