如何在PHP特征中使用数组引用声明抽象方法?

时间:2016-09-03 15:35:20

标签: php traits

当尝试使用表示具有声明的抽象方法的特征的类时,使用类型为array的类型的参数声明抽象方法

我收到以下错误:

PHP致命错误:MyTrait和MyClass在MyClass的组合中定义了相同的属性($ foo)。但是,定义不同并且被认为是不兼容的。类是由MyClass

组成的

如何在trait中声明一个抽象方法,以便要求Exhibit类只接受数组引用作为输入参数?

Trait和参展类中数组参考的参数的适当语法是什么?

(更新)示例:

<?php

const LOCATION_PRECISION = 7;
const LOCATION_LAT = '40.7591523';
const LOCATION_LNG = '-73.9777136';

trait Geocodes
{
    protected $recast = [];
    protected $precision = LOCATION_PRECISION;

    abstract function reCast(array &$payload);

}

class Location
{
    use Geocodes;

//FATAL: can't override here!
//protected $recast = [
//    'lat' => ['index' => 'lat', 'type' => 'double'],
//    'lng' => ['index' => 'lng', 'type' => 'double']
//];

protected $lat = LOCATION_LAT;
protected $lng = LOCATION_LNG;

public function __construct()
{
   $this->precision = LOCATION_PRECISION;
   $this->recast['lat'] = ['index' => 'lat', 'type' => 'double'];
   $this->recast['lng'] = ['index' => 'lng', 'type' => 'double'];
}

public function recast(array &$payload)
{
  foreach(array_keys($payload) as $key)
  {
      var_dump($payload);
      $api_key = $this->recast[$key]['index'];
      $api_type = $this->recast[$key]['type'];
      if(! array_key_exists($api_key, $payload))
            $payload[$api_key] = bcadd($payload[$key],0,$this->precision);
  }
}

public function getLat() { return $this->lat; }
public function getLng() { return $this->lng; }

}

$loc = new Location();
$payload = ['lat' => $loc->getLat(), 'lng' => $loc->getLng()];
$loc->recast($payload);

echo PHP_EOL.print_r($payload, 1).PHP_EOL;

1 个答案:

答案 0 :(得分:0)

简短回答是上面问题中的代码片段确实演示了如何正确地将对数组的引用声明为特征的抽象函数中的参数。它还显示了参展类内具体函数声明的正确语法。

我收到的错误以及可以在下面的代码片段中重现的错误发生了,因为我试图在展览类内的属性声明中覆盖特征的已定义属性。事实上,属性的名称和特征方法的名称是相同的,所以尽管我发布的代码示例在当时是不完整的,但是@Wes仍然感谢他们。

这是一个链接to the code,其中非工作行被注释掉了。您可以毫无错误地运行代码,然后取消注释问题区域,它将失败并显示原始帖子中的消息。