2016-07-15 161 views
0

我想這樣做:訪問在父母在PHP中的兒童定義的常量?

namespace Ffix\Cmc\Model; 

use Illuminate\Database\Eloquent\Model; 
abstract class AbstractMshopModel extends Model 
{ 
    protected $table = self::FFIX_TABLENAME; 
} 


namespace Ffix\Cmc\Model; 

use Illuminate\Database\Eloquent\Model; 
class MshopProduct extends AbstractMshopModel 
{ 
const FFIX_TABLENAME = 'mshop_product'; 

} 

,但我得到:

找不到固定 Ffix \ CMC \型號\ AbstractMshopModel :: FFIX_TABLENAME在 的/ var/www/html等/ myapp/app/Cmc/Model/AbstractMshopModel.php on line 16

現在我明白了,const還不存在。但它確實存在於孩子身上。我如何明確地訪問孩子?

編輯

基本上我希望能夠做到這一點:

SomeExternalScript.php

<?php 

//access MshopProduct::$table from outside without creating the whole object for doing so 
+1

使用構造 – rjdown

+0

好吧,我想你已經倒:''FFIX_TABLENAME應在AbstractMshopModel而不是AbstractMshopModel。 – felipsmartins

+0

@felipsmartins他希望爲每個子類別提供不同的值。 – Barmar

回答

1

屬性初始化必須使用常量可以評估當代碼編譯,它不能依賴於具體的對象。如果要動態確定該值,則必須使用分配給該屬性的構造函數。

常量必須在可以使用之前定義,所以我不認爲你可以在這裏使用一個。你應該使用子類必須實現的getter函數。

abstract class AbstractMshopModel extends Model 
{ 
    protected $table; 
    abstract static function getFFIXTablename(); 

    function __construct() { 
    $this->table = static::getFFIXTablename(); 
} 

class MshopProduct extends AbstractMshopModel 
{ 
    const FFIX_TABLENAME = 'mshop_product'; 
    static function getFFIXTableName() { 
     return FFIX_TABLENAME; 
    } 

} 
+0

這真的很醜,我必須重新定義每個子類上的'getFFIXTableName()'。 如果我放棄常數,該怎麼辦?有沒有辦法做一些像'抽象公共$ Ffix_tablename;或任何其他形式,保持子類清潔 – Toskan

+0

我不這麼認爲,但也許你可以找到一些在PHP搜索抽象類。 – Barmar

+0

我想過這樣做: 'class MshopProduct extends AbstractMshopl { const FFIX_TABLENAME ='mshop_product'; protected $ table = self :: FFIX_TABLENAME;'它被推遲了,但我沒有想出更簡單的東西 – Toskan