-1

我刚开始学习 PHP,但遇到了语法问题。我正在学习如何在 php 中编写一个类,并且我使用了一种类似于 Java 的语法。但是,我既不能让它的构造函数也不能正常工作,我不知道为什么。

<?php 
class bento {
  public $food;
  public $staple = "rice";
  protected $veggie = "kale";

  public function __construct($fd){
    $food = $fd;
  }

  public function getstaple(){
    return $staple;
  }
}

$chicken=new bento("chick");
echo "<br>".$chicken->food;
echo "<br>".$chicken->staple;
$fd=$chicken->getstaple();
echo "<br>".$fd;
echo "<br>".$chicken->getstaple();
?>

这是我得到的结果:

//result    

rice


//end of result

基本上,在 4 行中,我只有一行可以工作(打印出 $staple 变量)。构造函数没有将“chick”值分配给 $food。getstaple() 函数没有返回任何值。

我不知道如何让它工作。

4

4 回答 4

2

要引用班级成员,您应该使用 $this->food 或 $this->staple

class bento {
  public $food;
  public $staple = "rice";
  protected $veggie = "kale";

  public function __construct($fd){
    $this->food = $fd;
  }

  public function getstaple(){
    return $this->staple;
  }
}
于 2013-06-02T03:28:15.597 回答
0

在 java 中也是如此,您需要使用“this”关键字访问您的类变量。在 php 中,您可以执行以下操作:

$this->methodName();

或者

$this->variableName
于 2013-06-02T03:29:43.947 回答
0

在 PHP 中,所有变量在它们定义的范围内都是本地的(有一些语言提供的例外,如超全局变量 $_GET、$_POST、$REQUEST、$_SERVER 等)

这意味着当您在方法中引用 $food 时,您指的是在该方法中定义的 $food,换句话说,它是一个函数变量,而不是您想要的实例属性。

例如实例方法 PHP 可以很好地为您创建对调用方法的实例的引用$this这允许您通过这种格式从对象本身中引用对象的属性和方法。

$this->food = $fd

需要注意的另一件事是无法通过这种方式访问​​类方法和属性。它们需要使用范围解析运算符::,以便获取您将使用的静态定义的类属性或方法:

ClassName::method();

或者

ClassName::$property;

与php 一样,通过and关键字$this可以轻松访问类属性。selfstatic

self是对定义了静态方法的类的引用。

static是对调用静态方法的类的引用。

为了说明差异,请参阅此代码

class A {
     static public $toWho = "Class A";

     static public function sayHelloSelf(){
          echo "Hello ".self::$toWho;
     }

     static public function sayHelloStatic(){
          eecho "Hello ".static::$toWho;
     }
}

class B extends A {
     static public $toWho = "Class B";
}

B::sayHelloSelf(); // echos Hello Class A
B::sayHelloStatic(); // echos Hello Class B
于 2013-06-02T03:56:59.470 回答
0

this 关键字用于访问当前类中的类成员。您创建的类为变量 $food 分配了一些值。然后在您尝试访问变量的函数中,但 $food 是类变量,如果没有对象或范围解析运算符,我们将无法访问类成员。“this”具有当前对象名称。

于 2016-07-11T07:33:45.663 回答