簡體   English   中英

PHP,OOP:為什么我的類的array屬性不能像在類之外的數組那樣使用屬性和方法作為值?

[英]PHP, OOP: Why can't the array property of my class use properties & methods as values like an array outside of a class can?

因此,就像標題所說的那樣,我很難使我的一個類的數組屬性具有被聲明為屬性和方法的值。

如果數組不是類的屬性,則可以成功執行此操作,但是一旦將數組放入類中,腳本將不喜歡這些值,並引發此錯誤。

致命錯誤 :第17行的C:\\ xampp \\ htdocs_webdev \\ repos \\ mcf \\ static \\ inc \\ classes \\ class.catalogue.php中 ,常量表達式包含無效運算

我的兩個類都包含在另一個名為inc.classes.php .php 該文件然后包含在每個頁面中。 這里有一些代碼可以更好地說明我的問題,

Master Class File: inc.classes.php

// config
require_once('config/config.php'); // config file

// other tools
require_once(ROOT_DIR . 'inc/parsedown/Parsedown.php'); // tool that I am using for parsing .md files

// my classes
require_once(ROOT_DIR . 'inc/classes/class.vendor.php');
require_once(ROOT_DIR . 'inc/classes/class.catalogue.php');

Class A: class.vendor.php

class Vendor
{
  public $vendor = array(
    'foo' => array(
      'name' => 'Foo Inc.',
      'image' => (VENDOR_IMG . 'foo/foo-logo.png'),
    ),
    'bar' => array(
      'name' => 'Bar Co.',
      'image' => (VENDOR_IMG . 'bar/bar-logo.png'),
    ),
  );

  public function get($data) {
    if (array_key_exists($data, $this->vendors)) {
      return $this->vendors[$data];
    } else {
      // throw error
    }
  }

  // Class methods...
}

Class B: class.catalogue.php

class Catalogue
{
  public $catalogue = array(
    '1' => array(
      $section = $markdown->text(file_get_contents(ROOT_DIR . catalogue/markdown/section1.md')),
      $link = 'catalogue/pdf/section1.pdf,
      $pdf = (ROOT_DIR . $link),
      'title' => 'Section One',
      'content' => mdReplace($section, $pdf, $link),
      'theme' => 'purple',
      'vendors' => array(
        1 => $vendor->get('foo'),
        2 => $vendor->get('bar'),
      ),
    ),
    // '2' ...
  );

  // Class methods...
}

mdReplace()是一個小函數,位於一個名為inc.functions.php的單獨的php文件中。其目的是在包含該節內容的.md文件中替換一些關鍵字。)

如果我現在只是盲目蝙蝠,並且缺少明顯的東西,請提前道歉。

您不能在這樣的類屬性上運行方法。 您需要在構造中進行設置:

class Catalogue
{
  public $catalogue = array();

  public function __construct() 
  {
    $this->catalogue = array(
    '1' => array(
      $section = $markdown->text(file_get_contents(ROOT_DIR . catalogue/markdown/section1.md')),
      $link = 'catalogue/pdf/section1.pdf,
      $pdf = (ROOT_DIR . $link),
      'title' => 'Section One',
      'content' => mdReplace($section, $pdf, $link),
      'theme' => 'purple',
      'vendors' => array(
        1 => $vendor->get('foo'),
        2 => $vendor->get('bar'),
      ),
    ),
    // '2' ...
  );
 }
  // Class methods...
}

如果您仔細閱讀了php oop 手冊 ,在這里您將看到:

類成員變量稱為“屬性” ...它們是通過使用關鍵字publicprotectedprivate之一定義的,后跟普通的變量聲明。 該聲明可以包括一個初始化,但是此初始化必須是一個常量值-也就是說,它必須能夠在編譯時進行評估,並且必須不依賴於運行時信息才能進行評估。

看字

不得依賴於運行時信息

您當前對public $catalogue定義取決於某些數據,稍后將對其進行評估。 這就是為什么您有致命錯誤

因此,如前所述,解決方案是通過調用某些函數(例如,顯式地或在__construct填充$catalogue數據。

正如Farkie所說,您不能像以前那樣在類屬性上運行方法調用。

原因是,您嘗試使用的那些對象未初始化,為了使它們起作用,必須首先對其進行初始化。

由於無法使用而無法直接正確使用的Ex變量

  • $markdown
  • $pdf
  • $section

因此,對於B類,您需要將代碼編寫在構造函數中。

但是,您對A類所做的任何事情都是完全可以接受的,並且應該可以使用。 我可以看到變量名中有一個錯字。 當您嘗試在function get()中將其引用為$this->vendors[$data]; ,應該是$vendors $this->vendors[$data];

以下將工作

class Vendor
{
  public $vendors = array(
    'foo' => array(
      'name' => 'Foo Inc.',
      'image' => (VENDOR_IMG . 'foo/foo-logo.png'),
    ),
    'bar' => array(
      'name' => 'Bar Co.',
      'image' => (VENDOR_IMG . 'bar/bar-logo.png'),
    ),
  );

  public function get($data) {
    if (array_key_exists($data, $this->vendors)) {
      return $this->vendors[$data];
    } else {
      // throw error
    }
  }

  // Class methods...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM