【问题标题】:PHP class constructors and methodsPHP 类构造函数和方法
【发布时间】:2013-05-28 14:02:15
【问题描述】:

我刚开始学习 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() 函数没有返回任何值。

我不知道如何让它工作。

【问题讨论】:

  • 您需要将 $this 用于实例属性,例如$this->food = $fd。与 Java 不同,您不能直接引用属性名称。
  • 你会卖一些bento吗?寄一些到西班牙! (;

标签: php class function constructor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    $this->food = $fd
    

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

    ClassName::method();
    

    ClassName::$property;
    

    $this 一样,php 通过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
    

    【讨论】:

      【解决方案3】:

      在java中也一样,你需要使用“this”关键字来访问你的类变量。在 php 中,您会执行以下操作:

      $this->methodName();
      

      $this->variableName
      

      【讨论】:

      • 其实在Java中你不需要显式引用“this”;这就是 PHP 的不同之处。
      【解决方案4】:

      要引用班级成员,您应该使用 $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;
        }
      }
      

      【讨论】:

      • 另外,你知道如何实现多个构造函数吗?在 Java 中,我可以执行以下操作: classbento{bento(){ this("rice"); } 便当(字符串 fd){ 食物 = fd; }
      • 在 PHP 中最接近的是具有参数默认值的构造函数:__construct($fd = 'rice')
      猜你喜欢
      • 2016-02-09
      • 2012-03-01
      • 2022-11-27
      • 2017-01-21
      • 1970-01-01
      • 2022-11-24
      • 2012-09-02
      • 2010-09-13
      • 1970-01-01
      相关资源
      最近更新 更多