[英]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 手冊 ,在這里您將看到:
類成員變量稱為“屬性” ...它們是通過使用關鍵字public , protected或private之一定義的,后跟普通的變量聲明。 該聲明可以包括一個初始化,但是此初始化必須是一個常量值-也就是說,它必須能夠在編譯時進行評估,並且必須不依賴於運行時信息才能進行評估。
看字
不得依賴於運行時信息
您當前對public $catalogue
定義取決於某些數據,稍后將對其進行評估。 這就是為什么您有致命錯誤 。
因此,如前所述,解決方案是通過調用某些函數(例如,顯式地或在__construct
填充$catalogue
數據。
正如Farkie所說,您不能像以前那樣在類屬性上運行方法調用。
原因是,您嘗試使用的那些對象未初始化,為了使它們起作用,必須首先對其進行初始化。
由於無法使用而無法直接正確使用的Ex變量
$markdown
$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.