中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識庫 > YII2.0框架行為(Behavior)深入詳解

YII2.0框架行為(Behavior)深入詳解

熱門標簽:江西手機自動外呼防封系統是什么 哪里辦理400電話 仁和怎么申請400開頭的電話 廣州防封卡外呼系統多少錢一個月 外呼系統撥打暫時無法接通 長春人工外呼系統服務商 高德地圖標注家 廣東地市地圖標注 怎么向銷售公司推銷外呼系統

本文實例講述了YII2.0框架行為(Behavior)。分享給大家供大家參考,具體如下:

行為(Behavior)

使用行為(behavior)可以在不修改現有類的情況下,對類的功能進行擴充。 通過將行為綁定到一個類,可以使類具有行為本身所定義的屬性和方法,就好像類本來就有這些屬性和方法一樣。 而且不需要寫一個新的類去繼承或包含現有類。

Yii中的行為,其實是 yii\base\Behavior 類的實例, 只要將一個Behavior實例綁定到任意的 yii\base\Component 實例上, 這個Component就可以擁有該Behavior所定義的屬性和方法了。而如果將行為與事件關聯起來,可以玩的花樣就更多了。

但有一點需要注意,Behavior只能與Component類綁定。 他們是天生的一對,愛情不是你想買,想買就能買的,必要的物質是少不了的,奮斗吧少年。 所以,如果你寫了一個類,需要使用到行為,那么就果斷地繼承自yii\base\Component

同時,行為單獨靠Behavior一方是實現不了的,就好像愛情不是一廂情愿。 為了支持Behavior,Yii對于yii\base\Component 也進行了精心設計,這兩者共同配合,才有了神奇的行為。

使用行為

一個綁定了行為的類,表現起來是這樣的:

// Step 1: 定義一個將綁定行為的類
class MyClass extends yii\base\Component
{
 // 空的
}
// Step 2: 定義一個行為類,他將綁定到MyClass上
class MyBehavior extends yii\base\Behavior
{
 // 行為的一個屬性
 public $property1 = 'This is property in MyBehavior.';
 // 行為的一個方法
 public function method1()
 {
  return 'Method in MyBehavior is called.';
 }
}
$myClass = new MyClass();
$myBehavior = new MyBehavior();
// Step 3: 將行為綁定到類上
$myClass->attachBehavior('myBehavior', $myBehavior);
// Step 4: 訪問行為中的屬性和方法,就和訪問類自身的屬性和方法一樣
echo $myClass->property1;
echo $myClass->method1();

上面的代碼你不用全都看懂,雖然你可能已經用腳趾頭猜到了這些代碼的意思, 但這里你只需要記住行為中的屬性和方法可以被所綁定的類像訪問自身的屬性和方法一樣直接訪問就OK了。 代碼中, $myClass 是沒有property1 method() 成員的。這倆是 $myBehavior 的成員。 但是,通過 attachBehavior() 將行為綁定到對象之后, $myCalss 就好像練成了吸星大法、化功大法,表現的財大氣粗,將別人的屬性和方法都變成了自己的。

另外,從上面的代碼中,你還要掌握使用行為的大致流程:

  • yii\base\Component 派生自己的類,以便使用行為;
  • yii\base\Behavior 派生自己的行為類,里面定義行為涉及到的屬性、方法;
  • 將Component和Behavior綁定起來;
  • 像使用Component自身的屬性和方法一樣,盡情使用行為中定義的屬性和方法。

行為的要素

我們提到了行為只是 yii\base\Behavior 類的實例。 那么這個類究竟有什么秘密呢?其實說破了也沒有什么的他只是一個簡單的封裝而已,非常的簡單:

class Behavior extends Object
{
 // 指向行為本身所綁定的Component對象
 public $owner;
 // Behavior 基類本身沒用,主要是子類使用,重載這個函數返回一個數組表
 // 示行為所關聯的事件
 public function events()
 {
  return [];
 }
 // 綁定行為到 $owner
 public function attach($owner)
 {
  ... ...
 }
 // 解除綁定
 public function detach()
 {
  ... ...
 }
}

這就是Behavior的全部代碼了,是不是很簡單?Behavior類的要素的確很簡單:

  • $owner 成員變量,用于指向行為的依附對象;
  • events() 用于表示行為所有要響應的事件;
  • attach() 用于將行為與Component綁定起來;
  • deatch() 用于將行為從Component上解除。

下面分別進行講解。

行為的依附對象

yii\base\Behavior::$owner 指向的是Behavior實例本身所依附的對象。這是行為中引用所依附對象的唯一手段了。 通過這個 $owner ,行為才能訪問所依附的Component,才能將本身的方法作為事件handler綁定到Component上。

$owner 由 yii\base\Behavior::attach() 進行賦值。 也就是在將行為綁定到某個Component時, $owner 就已經名花有主了。 一般情況下,不需要你自己手動去指定 $owner 的值, 在調用 yii\base\Componet::attachBehavior() 將行為與對象綁定時, Component會自動地將 $this 作為參數,調用 yii\base\Behavior::attach()

有一點需要格外注意,由于行為從本質來講是一個PHP類,其方法就是類方法,就是成員函數。 所以,在行為的方法中, $this 引用的是行為本身, 試圖通過 $this 來訪問行為所依附的Component是行不通的。 正確的方法是通過 yii\base\Behavior::$owner 來訪問Component。

行為所要響應的事件

行為與事件結合后,可以在不對類作修改的情況下,補充類在事件觸發后的各種不同反應。 為此,只需要重載yii\base\Behavior::events() 方法,表示這個行為將對類的何種事件進行何種反饋即可:

namespace app\Components;
use yii\db\ActiveRecord;
use yii\base\Behavior;
class MyBehavior extends Behavior
{
 // 重載events() 使得在事件觸發時,調用行為中的一些方法
 public function events()
 {
  // 在EVENT_BEFORE_VALIDATE事件觸發時,調用成員函數 beforeValidate
  return [
   ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
  ];
 }
 // 注意beforeValidate 是行為的成員函數,而不是綁定的類的成員函數。
 // 還要注意,這個函數的簽名,要滿足事件handler的要求。
 public function beforeValidate($event)
 {
  // ...
 }
}

上面的代碼中, events() 返回一個數組,表示所要做出響應的事件, 上例中的事件是ActiveRecord::EVENT_BEFORE_VALIDATE ,以數組的鍵來表示, 而數組的值則表示做好反應的事件handler,上例中是beforeValidate() ,事件handler可以是以下形式:

  • 字符串,表示行為類的方法,如上面的例就是這種情況。 這個是與事件handler不同的,事件handler中使用字符串時,是表示PHP全局函數,而這里表示行為類內部的方法。
  • 一個對象或類的成員函數,以數組的形式,如 [$object, 'methodName'] 。這個與事件handler是一致的。
  • 一個匿名函數。

對于事件響應函數的簽名,要求與事件handler一樣:

function ($event) { }

具體內容,請參考 事件(Event) 的內容。

行為的綁定與解除

說到綁定與解除,這意味著這個事情有2方,行為和Component。單獨一方是沒有綁定或解除的說法的。 因此,這里我們先賣一關子,等后面講綁定和解除的原理時,再來講有關的內容。

這里你只需要知道,對于綁定和解除,Behavior 分別使用 attach()detach() 來實現就OK了。

定義一個行為

定義一個行為,就是準備好要注入到現有類中去的屬性和方法, 這些屬性和方法要寫到一個 yii\base\Behavior 類中。 所以,定義一個行為,就是寫一個 Behavior的子類,子類中包含了所要注入的屬性和方法:

namespace app\Components;
use yii\base\Behavior;
class MyBehavior extends Behavior
{
 public $prop1;
 private $_prop2;
 private $_prop3;
 private $_prop4;
 public function getProp2()
 {
  return $this->_prop2;
 }
 public function setProp3($value)
 {
  $this->_prop3 = $value;
 }
 public function foo()
 {
  // ...
 }
 protected function bar()
 {
  // ...
 }
}

上面的代碼通過定義一個 app\Components\MyBehavior 類而定義一個行為。 由于 MyBehavior 繼承自yii\base\Behavior 從而間接地繼承自 yii\base\Object 。 沒錯,這是我們的老朋友了。因此,這個類有一個public的成員變量 prop1 , 一個只讀屬性 prop2 ,一個只寫屬性 prop3 ,一個public的方法 foo() 。 另外,還有一個private 的成員變量 $_prop4 ,一個protected 的方法 bar() 。 如果你不清楚只讀屬性和只寫屬性,最好回頭看看 屬性(Property) 部分的內容。

當這MyBehavior與一個Component綁定后, 綁定的Component也就擁有了 prop1 prop2 這兩個屬性和方法foo() ,因為他們都是 public 的。 而 private 的 $_prop4 和 protected 的 bar 就得不到了。 至于原因么,后面講行為注入的原理時,我們再解釋。

行為的綁定

行為的綁定通常是由Component來發起。有兩種方式可以將一個Behavior綁定到一個 yii\base\Component 。 一種是靜態的方法,另一種是動態的。靜態的方法在實踐中用得比較多一些。 因為一般情況下,在你的代碼沒跑起來之前,一個類應當具有何種行為,是確定的。 動態綁定的方法主要是提供了更靈活的方式,但實際使用中并不多見。

靜態方法綁定行為

靜態綁定行為,只需要重載 yii\base\Component::behaviors() 就可以了。 這個方法用于描述類所具有的行為。如何描述呢? 使用配置來描述,可以是Behavior類名,也可以是Behavior類的配置數組:

namespace app\models;
use yii\db\ActiveRecord;
use app\Components\MyBehavior;
class User extends ActiveRecord
{
 public function behaviors()
 {
  return [
   // 匿名的行為,僅直接給出行為的類名稱
   MyBehavior::className(),
   // 名為myBehavior2的行為,也是僅給出行為的類名稱
   'myBehavior2' => MyBehavior::className(),
   // 匿名行為,給出了MyBehavior類的配置數組
   [
    'class' => MyBehavior::className(),
    'prop1' => 'value1',
    'prop3' => 'value3',
   ],
   // 名為myBehavior4的行為,也是給出了MyBehavior類的配置數組
   'myBehavior4' => [
    'class' => MyBehavior::className(),
    'prop1' => 'value1',
    'prop3' => 'value3',
   ]
  ];
 }
}

還有一個靜態的綁定辦法,就是通過配置文件來綁定:

[
 'as myBehavior2' => MyBehavior::className(),
 'as myBehavior3' => [
  'class' => MyBehavior::className(),
  'prop1' => 'value1',
  'prop3' => 'value3',
 ],
]

具體參見配置項(Configuration) 部分的內容。

動態方法綁定行為

動態綁定行為,需要調用 yii\base\Compoent::attachBehaviors():

$Component->attachBehaviors([
 'myBehavior1' => new MyBehavior, // 這是一個命名行為
 MyBehavior::className(),   // 這是一個匿名行為
]);

這個方法接受一個數組參數,參數的含義與上面靜態綁定行為是一樣一樣的。

在上面的這些例子中,以數組的鍵作為行為的命名,而對于沒有提供鍵名的行為,就是匿名行為。

對于命名的行為,可以調用 yii\base\Component::getBehavior() 來取得這個綁定好的行為:

$behavior = $Component->getBehavior('myBehavior2');

對于匿名的行為,則沒有辦法直接引用了。但是,可以獲取所有的綁定好的行為:

$behaviors = $Component->getBehaviors();

綁定的內部原理

只是重載一個 yii\base\Component::behaviors() 就可以這么神奇地使用行為了? 這只是冰山的一角,實際上關系到綁定的過程,有關的方面有:

  • yii\base\Component::behaviors()
  • yii\base\Component::ensureBehaviors()
  • yii\base\Component::attachBehaviorInternal()
  • yii\base\Behavior::attach()

4個方法中,Behavior只占其一,更多的代碼,是在Component中完成的。

yii\base\Component::behaviors() 上面講靜態方法綁定行為時已經提到了,就是返回一個數組用于描述行為。 那么yii\base\Component::ensuerBehaviors() 呢?

這個方法會在Component的諸多地方調用 __get() __set() __isset() __unset() __call() canGetProperty()hasMethod() hasEventHandlers() on() off() 等用到,看到這么多是不是頭疼?一點都不復雜,一句話,只要涉及到類的屬性、方法、事件這個函數都會被調用到。

這么眾星拱月,被諸多凡人所需要的 ensureBehaviors() 究竟是何許人也? 就像名字所表明的,他的作用在于“ensure” 。其實只是確保 behaviors() 中所描述的行為已經進行了綁定而已:

public function ensureBehaviors()
{
 // 為null表示尚未綁定
 // 多說一句,為空數組表示沒有綁定任何行為
 if ($this->_behaviors === null) {
  $this->_behaviors = [];
  // 遍歷 $this->behaviors() 返回的數組,并綁定
  foreach ($this->behaviors() as $name => $behavior) {
   $this->attachBehaviorInternal($name, $behavior);
  }
 }
}

這個方法主要是對子類用的, yii\base\Compoent 沒有任何預先注入的行為,所以,這個調用沒有用。 但是對于子類,你可能重載了 yii\base\Compoent::behaviros() 來預先注入一些行為。 那么,這個函數會將這些行為先注入進來。

從上面的代碼中,自然就看到了接下來要說的第三個東東, yii\base\Component\attachBehaviorInternal():

private function attachBehaviorInternal($name, $behavior)
{
 // 不是 Behavior 實例,說是只是類名、配置數組,那么就創建出來吧
 if (!($behavior instanceof Behavior)) {
  $behavior = Yii::createObject($behavior);
 }
 // 匿名行為
 if (is_int($name)) {
  $behavior->attach($this);
  $this->_behaviors[] = $behavior;
 // 命名行為
 } else {
  // 已經有一個同名的行為,要先解除,再將新的行為綁定上去。
  if (isset($this->_behaviors[$name])) {
   $this->_behaviors[$name]->detach();
  }
  $behavior->attach($this);
  $this->_behaviors[$name] = $behavior;
 }
 return $behavior;
}

首先要注意到,這是一個private成員。其實在Yii中,所有后綴為 *Internal 的方法,都是私有的。 這個方法干了這么幾件事:

  • 如果 $behavior 參數并非是一個 Behavior 實例,就以之為參數,用 Yii::createObject() 創建出來。
  • 如果以匿名行為的形式綁定行為,那么直接將行為附加在這個類上。
  • 如果是命名行為,先看看是否有同名的行為已經綁定在這個類上,如果有,用后來的行為取代之前的行為。

yii\base\Component::attachBehaviorInternal() 中, 以 $this 為參數調用了 yii\base\Behavior::attach() 。 從而,引出了跟綁定相關的最后一個家伙 yii\base\Behavior::attach() , 這也是前面我們講行為的要素時沒講完的。先看看代碼:

public function attach($owner)
{
 $this->owner = $owner;
 foreach ($this->events() as $event => $handler) {
  $owner->on($event, is_string($handler) ? [$this, $handler] :
   $handler);
 }
}

上面的代碼干了兩件事:

  • 設置好行為的 $owner ,使得行為可以訪問、操作所依附的對象
  • 遍歷行為中的 events() 返回的數組,將準備響應的事件,通過所依附類的 on() 綁定到類上

說了這么多,關于綁定,做個小結:

  • 綁定的動作從Component發起;
  • 靜態綁定通過重載 yii\base\Componet::behaviors() 實現;
  • 動態綁定通過調用 yii\base\Component::attachBehaviors() 實現;
  • 行為還可以通過為 Component 配置 as 配置項進行綁定;
  • 行為有匿名行為和命名行為之分,區別在于綁定時是否給出命名。 命名行為可以通過其命名進行標識,從而有針對性地進行解除等操作;
  • 綁定過程中,后綁定的行為會取代已經綁定的同名行為;
  • 綁定的意義有兩點,一是為行為設置 $owner 。二是將行為中擬響應的事件的handler綁定到類中去。

解除行為

解除行為只需調用 yii\base\Component::detachBehavior() 就OK了:

$Component->detachBehavior('myBehavior2');

這樣就可以解除已經綁定好的名為 myBehavior2 的行為了。 但是,對于匿名行為,這個方法就無從下手了。不過我們可以一不做二不休,解除所有綁定好的行為:

$Component->detachBehaviors();

這上面兩種方法,都會調用到 yii\base\Behavior::detach() ,其代碼如下:

public function detach()
{
 // 這得是個名花有主的行為才有解除一說
 if ($this->owner) {
  // 遍歷行為定義的事件,一一解除
  foreach ($this->events() as $event => $handler) {
   $this->owner->off($event, is_string($handler) ? [$this,
    $handler] : $handler);
  }
  $this->owner = null;
 }
}

yii\base\Behavior::attach() 相反,解除的過程就是干兩件事: 一是將 $owner 設置為 null ,表示這個行為沒有依附到任何類上。 二是通過Component的 off() 將綁定到類上的事件hanlder解除下來。一句話,善始善終。

行為響應的事件實例

上面的綁定和解除過程,我們看到Yii費了那么大勁,主要就是為了將行為中的事件handler綁定到類中去。 在實際編程時,行為用得最多的,也是對于Compoent各種事件的響應。 通過行為注入,可以在不修改現有類的代碼的情況下,更改、擴展類對于事件的響應和支持。 使用這個技巧,可以玩出很炫的花樣。 而要將行為與Component的事件關聯起來,就要通過 yii\base\Behavior::events() 方法。

上面Behavior基類的代碼中,這個方法只是返回了一個空數組,說明不對所依附的Compoent的任何事件產生關聯。 但是在實際使用時,往往通過重載這個方法來告訴Yii,這個行為將對Compoent的何種事件,使用哪個方法進行處理。

比如,Yii自帶的 yii\behaviors\AttributeBehavior 類,定義了在一個 ActiveRecord 對象的某些事件發生時, 自動對某些字段進行修改的行為。 他有一個很常用的子類 yii\behaviors\TimeStampBehavior 用于將指定的字段設置為一個當前的時間戳。 常用于表示最后修改日期、上次登陸時間等場景。我們以這個行為為例,來分析行為響應事件的原理。

yii\behaviors\AttributeBehavior::event() 中,代碼如下:

public function events()
{
 return array_fill_keys(array_keys($this->attributes),
  'evaluateAttributes');
}

這段代碼的意思這里不作過多深入,學有余力的讀者朋友可以自行研究,難度并不高。 這里,你只需要大致知道,這段代碼將返回一個數組,其鍵值為 $this->attributes 數組的鍵值, 數組元素的值為成員函數evaluateAttributes 。

而在 yii\behaviors\TimeStampBehavior::init() 中,有以下的代碼:

public function init()
{
 parent::init();
 if (empty($this->attributes)) {
  // 重點看這里
  $this->attributes = [
   BaseActiveRecord::EVENT_BEFORE_INSERT =>
    [$this->createdAtAttribute, $this->updatedAtAttribute],
   BaseActiveRecord::EVENT_BEFORE_UPDATE =>
    $this->updatedAtAttribute,
  ];
 }
}

上面的代碼重點看的是對于 $this->attributes 的初始化部分。 結合上面2個方法的代碼,對于yii\base\Behavior::events() 的返回數組,其格式應該是這樣的:

return [
 BaseActiveRecord::EVENT_BEFORE_INSERT => 'evaluateAttributes',
 BaseActiveRecord::EVENT_BEFORE_UPDATE => 'evaluateAttributes',
];

數組的鍵值用于指定要響應的事件, 這里是 BaseActiveRecord::EVENT_BEFORE_INSERTBaseActiveRecord::EVENT_BEFORE_UPDATE 。 數組的值是一個事件handler,如上面的 evaluateAttributes 。

那么一旦TimeStampBehavior與某個ActiveRecord綁定,就會調用 yii\behaviors\TimeStampBehavior::attach() , 那么就會有:

// 這里 $owner 是某個 ActiveRecord
public function attach($owner)
{
 $this->owner = $owner;
 // 遍歷上面提到的 events() 所定義的數組
 foreach ($this->events() as $event => $handler) {
  // 調用 ActiveRecord::on 來綁定事件
  // 這里 $handler 為字符串 `evaluateAttributes`
  // 因此,相當于調用 on(BaseActiveRecord::EVENT_BEFORE_INSERT,
  // [$this, 'evaluateAttributes'])
  $owner->on($event, is_string($handler) ? [$this, $handler] :
   $handler);
 }
}

因此,事件 BaseActiveRecord::EVENT_BEFORE_INSERTBaseActiveRecord::EVENT_BEFORE_UPDATE 就綁定到了ActiveRecord上了。當新建記錄或更新記錄時, TimeStampBehavior::evaluateAttributes 就會被觸發。 從而實現時間戳的功能。具體可以看看 yii\behaviors\AttributeBehavior::evaluateAttributes()yii\behaviors\TimeStampBehavior::getValues() 的代碼。這里因為只是具體功能實現,對于行為的理解關系不大。 就不把代碼粘出來占用篇幅了。

行為的屬性和方法注入原理

上面我們了解到了行為的用意在于將自身的屬性和方法注入給所依附的類。 那么Yii中是如何將一個行為yii\base\Behavior 的屬性和方法, 注入到一個 yii\base\Component 中的呢? 對于屬性而言,是通過 __get()__set() 魔術方法來實現的。 對于方法,是通過 __call() 方法。

屬性的注入

以讀取為例,如果訪問 $Component->property1 ,Yii在幕后干了些什么呢? 這個看看 yii\base\Component::__get()

public function __get($name)
{
 $getter = 'get' . $name;
 if (method_exists($this, $getter)) {
  return $this->$getter();
 } else {
  // 注意這個 else 分支的內容,正是與 yii\base\Object::__get() 的
  // 不同之處
  $this->ensureBehaviors();
  foreach ($this->_behaviors as $behavior) {
   if ($behavior->canGetProperty($name)) {
    // 屬性在行為中須為 public。否則不可能通過下面的形式訪問呀。
    return $behavior->$name;
   }
  }
 }
 if (method_exists($this, 'set' . $name)) {
  throw new InvalidCallException('Getting write-only property: ' .
   get_class($this) . '::' . $name);
 } else {
  throw new UnknownPropertyException('Getting unknown property: ' .
   get_class($this) . '::' . $name);
 }
}

重點來看 yii\base\Compoent::__get()yii\base\Object::__get() 的不同之處。 就是在于對于未定義getter函數之后的處理, yii\base\Object 是直接拋出異常, 告訴你想要訪問的屬性不存在之類。 但是 yii\base\Component則是在不存在getter之后,還要看看是不是注入的行為的屬性:

  • 首先,調用了 $this->ensureBehaviors() 。這個方法已經在前面講過了,主要是確保行為已經綁定。
  • 在確保行為已經綁定后,開始遍歷 $this->_behaviors 。 Yii將類所有綁定的行為都保存在yii\base\Compoent::$_behaviors[] 數組中。
  • 最后,通過行為的 canGetProperty() 判斷這個屬性, 是否是所綁定行為的可讀屬性,如果是,就返回這個行為的這個屬性 $behavior->name 。 完成屬性的讀取。 至于 canGetProperty() 已經在 :ref::property 部分已經簡單講過了, 后面還會有針對性地一個介紹。

對于setter,代碼類似,這里就不占用篇幅了。

方法的注入

與屬性的注入通過 __get() __set() 魔術方法類似, Yii通過 __call() 魔術方法實現對行為中方法的注入:

public function __call($name, $params)
{
 $this->ensureBehaviors();
 foreach ($this->_behaviors as $object) {
  if ($object->hasMethod($name)) {
   return call_user_func_array([$object, $name], $params);
  }
 }
 throw new UnknownMethodException('Calling unknown method: ' .
  get_class($this) . "::$name()");
}

從上面的代碼中可以看出,Yii還是先是調用了 $this->ensureBehaviors() 確保行為已經綁定。

然后,也是遍歷 yii\base\Component::$_behaviros[] 數組。 通過 hasMethod() 方法判斷方法是否存在。 如果所綁定的行為中要調用的方法存在,則使用PHP的 call_user_func_array() 調用之。 至于 hasMethod() 方法,我們后面再講。

注入屬性與方法的訪問控制

在前面我們針對行為中public和private、protected的成員在所綁定的類中是否可訪問舉出了具體例子。 這里我們從代碼層面解析原因。

在上面的內容,我們知道,一個屬性可不可訪問,主要看行為的 canGetProperty()canSetProperty() 。 而一個方法可不可調用,主要看行為的 hasMethod() 。 由于 yii\base\Behavior 繼承自我們的老朋友 yii\base\Object ,所以上面提到的三個判斷方法, 事實上代碼都在 Object 中。我們一個一個來看:

public function canGetProperty($name, $checkVars = true)
{
 return method_exists($this, 'get' . $name) || $checkVars 
  property_exists($this, $name);
}
public function canSetProperty($name, $checkVars = true)
{
 return method_exists($this, 'set' . $name) || $checkVars 
  property_exists($this, $name);
}
public function hasMethod($name)
{
 return method_exists($this, $name);
}

這三個方法真的談不上復雜。對此,我們可以得出以下結論:

  • 當向Component綁定的行為讀取(寫入)一個屬性時,如果行為為該屬性定義了一個getter (setter),則可以訪問。 或者,如果行為確實具有該成員變量即可通過上面的判斷,此時,該成員變量可為 public, private, protected。 但最終只有 public 的成員變量才能正確訪問。原因在上面講注入的原理時已經交待了。
  • 當調用Component綁定的行為的一個方法時,如果行為已經定義了該方法,即可通過上面的判斷。 此時,這個方法可以為 public, private, protected。 但最終只有 public 的方法才能正確調用。如果你理解了上一款的原因,那么這里也就理解了。

行為與繼承和特性(Traits) 的區別

從實現的效果看,你是不是會認為Yii真是多此一舉?PHP中要達到這樣的效果,可以使用繼承呀,可以使用PHP新引入的特性(Traits)呀。但是,行為具有繼承和特性所沒有的優點,從實際使用的角度講,繼承和特性更靠底層點。靠底層,就意味著開發效率低,運行效率高。行為的引入,是以可以接受的運行效率犧牲為成本,謀取開發效率大提升的一筆買賣。

行為與繼承

首先來講,拿行為與繼承比較,從邏輯上是不對的,這兩者是在完全不同的層面上的事物,是不對等的。之所以進行比較,是因為在實現的效果上,兩者有的類似的地方。看起來,行為和繼承都可以使一個類具有另一個類的屬性和方法,從而達到擴充類的功能的目的。

相比較于使用繼承的方式來擴充類功能,使用行為的方式,一是不必對現有類進行修改,二是PHP不支持多繼承,但是Yii可以綁定多個行為,從而達到類似多繼承的效果。

反過來,行為是絕對無法替代繼承的。亞洲人,美洲人都是地球人,你可以將亞洲人和美洲人當成地球人來對待。但是,你絕對不能把一只在某些方面表現得像人的猴子,真的當成人來對待。

這里就不展開講了。從本質上來講,行為只是一種設計模式,是解決問題的方法學。繼承則是PHP作為編程語言所提供的特性,根本不在一個層次上。

行為與特性

特性是PHP5.4之后引入的一個新feature。從實現效果看,行為與特性都達到把自身的public 變量、屬性、方法注入到當前類中去的目的。在使用上,他們也各有所長,但總的原則可以按下面的提示進行把握。

傾向于使用行為的情況:

  • 行為從本質上講,也是PHP的類,因此一個行為可以繼承自另一個行為,從而實現代碼的復用。而特性只是PHP的一種語法,效果上類似于把特性的代碼導入到了類中從而實現代碼的注入,特性是不支持繼承的。
  • 行為可以動態地綁定、解除,而不必要對類進行修改。但是特性必須在類在使用 use 語句,要解除特性時,則要刪除這個語句。換句話說,需要對類進行修改。
  • 行為還以在在配置階段進行綁定,特性就不行了。
  • 行為可以用于對事件進行反饋,而特性不行。
  • 當出現命名沖突時,行為會自行排除沖突,自動使用先綁定的行為。而特性在發生沖突時,需要人為干預,修改發生沖突的變量名、屬性名、方法名。

傾向于使用特性的情況:

  • 特性比行為在效率上要高一點,因為行為其實是類的實例,需要時間和空間進行分配。
  • 特性是PHP的語法,因此,IDE的支持要好一些。目前還沒有IDE能支持行為。

更多關于Yii相關內容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向對象程序設計入門教程》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。

您可能感興趣的文章:
  • Yii框架組件和事件行為管理詳解
  • Yii框架組件的事件機制原理與用法分析
  • Yii2表單事件之Ajax提交實現方法
  • 深入解析PHP的Yii框架中的event事件機制
  • 詳解在PHP的Yii框架中使用行為Behaviors的方法
  • 詳解PHP的Yii框架中組件行為的屬性注入和方法注入
  • yii2學習教程之5種內置行為類詳解
  • PHP的Yii框架中行為的定義與綁定方法講解
  • yii2行為的方法如何注入到組件類中詳解
  • PHP的Yii框架中移除組件所綁定的行為的方法
  • YII框架行為behaviors用法示例
  • YII2框架中behavior行為的理解與使用方法示例
  • Yii Framework框架中事件和行為的區別及應用實例分析

標簽:湘西 海北 文山 廈門 黔東 濮陽 惠州 梅河口

巨人網絡通訊聲明:本文標題《YII2.0框架行為(Behavior)深入詳解》,本文關鍵詞  YII2.0,框架,行為,Behavior,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《YII2.0框架行為(Behavior)深入詳解》相關的同類信息!
  • 本頁收集關于YII2.0框架行為(Behavior)深入詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 上海 食品机械有限公司| 天津市钢铁贸易有限公司| 建湖县液压机械有限公司| 才美机械制造(上海)有限公司| 五莲县机械有限公司| 厦门船舶重工有限公司| 上海胡鑫机械有限公司| 东莞市世翔精密机械制造有限公司| 恒联食品机械有限公司| 迎阳无纺机械有限公司| 杭州西子重工有限公司| 三门峡机械有限公司| 合肥亿恒机械有限公司| 新乡天丰机械有限公司| 大连工进机械制造有限公司| 河北工程机械有限公司| 国机铸锻机械有限公司| 上海神农机械有限公司| 京雕精密机械有限公司| 南京神鹏机械设备有限公司 | 佰源机械有限公司欠款| 河北澳金机械设备有限公司 | 农业机械有限公司招聘| 无锡奥野机械有限公司| 大丰联鑫钢铁有限公司| 上海志程机械设备有限公司| 河南省邦恩机械制造有限公司| 常州塑料机械有限公司| 广东中泽重工有限公司| 山东钢铁日照钢铁有限公司| 威海新元化工机械有限公司| 卫华起重机有限公司| 中核华兴达丰机械工程有限公司| 苏州松博机械有限公司| 启益电器机械有限公司| 上海汉虹精密机械有限公司| 杭州大禹机械有限公司| 武汉东泰盛机械有限公司| 常州金源机械设备有限公司| 河南千里马工程机械有限公司| 江苏机械设备有限公司| 江苏熔盛重工有限公司| 安徽好运机械有限公司| 河北新金钢铁有限公司| 新疆昆仑钢铁有限公司| 焦作市机械制造有限公司| 上海钢铁物资有限公司| 河南机械制造有限公司| 沧州凯德机械有限公司| 东莞市全永机械制造有限公司| 张家港 机械有限公司| 宁波市鸿博机械制造有限公司 | 康铖机械设备有限公司| 昆山乙盛机械工业有限公司电话| 河南耿力机械有限公司| 禹城益佳机械有限公司| 青岛非凡包装机械有限公司| 成都液压机械有限公司| 机械设计 有限公司| 重庆旺田机械有限公司| 骁马机械上海有限公司| 北京城建重工有限公司| 宁波钢铁有限公司地址| 昆山昆成机械有限公司| 成都机械制造有限公司| 苏州艾卓精密机械有限公司| 青岛高通机械有限公司| 东莞宏彰机械有限公司| 常州金源机械设备有限公司 | 川崎精密机械苏州有限公司| 建荣精密机械有限公司| 青州康达机械有限公司| 东莞机械设备有限公司| 江宏机械制造有限公司| 北京现代京城工程机械有限公司| 邢台正佳机械制造有限公司| 杭州驰丰机械有限公司| 莱钢永锋钢铁有限公司| 坎山机械有限公司招聘| 深圳海邻机械设备有限公司| 江苏华粮机械有限公司| 华隆 机械有限公司| 大江重工焦作有限公司| 上海文胜机械设备有限公司 | 河南甲庚机械设备有限公司| 唐山利军机械有限公司| 昆山奥德机械有限公司| 济南食品机械有限公司| 南通科邦机械有限公司| 济南华工液压机械有限公司| 东风井关农业机械有限公司 | 上海众德机械有限公司| 上海众星洗涤机械制造有限公司| 东莞市宝腾机械有限公司| 广州新欧机械有限公司| 广东星联精密机械有限公司| 山东九环石油机械有限公司| 杭州建明机械有限公司| 深圳市精密达机械有限公司| 湖南一田农业机械有限公司| 浙江富昌机械有限公司| 上海以海机械有限公司| 上海沛愉机械制造有限公司| 宁波立强机械有限公司| 深圳起点云有限公司| 宁波天佳塑料机械有限公司| 成都大华路面机械有限公司| 山东山推工程机械结构件有限公司| 浙江富龙钢铁有限公司| 海宁纺织机械有限公司| 洛阳中收机械装备有限公司招聘| 成都中挖机械有限公司| 濮阳市机械有限公司| 瑞安正博机械有限公司| 洛阳震动机械有限公司| 上海楷钛机械制造有限公司| 天津文洲机械有限公司| 重庆海迅机械制造有限公司| 济南赛信机械有限公司| 诸城盛和机械有限公司| 山东机械制造有限公司| 苏州苏安起重吊装有限公司| 新乐华宝塑料机械有限公司| 东莞市利成机械有限公司| 浙江正润机械有限公司| 合肥浩凯机械有限公司| 济南聚鑫机械有限公司| 涂装机械设备有限公司| 江苏佳成机械有限公司| 合肥明泰机械施工有限公司| 无锡宝露重工有限公司| 临海机械有限公司招聘| 青岛海佳机械有限公司| 浙江速成精密机械有限公司| 唐山鑫杭钢铁有限公司| 滦南华瑞钢铁有限公司| 东风悦达起亚汽车有限公司| 盐城联鑫钢铁有限公司| 腾达机械设备有限公司| 宁波雄腾机械有限公司| 邢台凌远机械制造有限公司| 山东顺达机械有限公司| 上海科峰机械有限公司| 鞍山重工机械有限公司| 青州泰达机械有限公司| 河北实阳机械有限公司| 山东华屹重工有限公司| 武汉环卫机械有限公司| 东莞市源机械有限公司| 江苏巨威机械有限公司| 上海理贝包装机械有限公司| 江苏长强钢铁有限公司| 一帆机械设备有限公司| 东莞智荣机械有限公司| 大连世达重工有限公司| 浙江建机起重机械有限公司| 重庆起重机厂有限公司| 山东泗水鑫峰面粉机械有限公司| 诸城市金祥机械有限公司| 马鞍山钢铁有限公司| 宁波博纳机械有限公司| 上海天勇机械设备有限公司 | 浙江合诺机械有限公司| 珠海 机械 有限公司| 长江机械设备有限公司| 青岛天乐机械有限公司| 北京液压机械有限公司| 江苏百德机械有限公司| 农业发展有限公司起名| 沂水巨龙机械有限公司| 苏州精密机械有限公司| 威海欧东机械有限公司| 广州 机械 有限公司| 上海鸿尔机械有限公司| 大京机械山东有限公司| 扬州精密机械有限公司| 中山市翠山机械制造有限公司| 上海澳昊机械制造有限公司| 昆山机械制造有限公司| 江苏金荣机械有限公司| 保定东利机械制造有限公司| 电子有限公司起名大全| 大连 工程机械有限公司| 河南长城机械有限公司| 福建三联机械有限公司| 陕西鑫钢机械有限公司| 四川开拓建筑机械租赁有限公司| 苏州市星光精密机械有限公司| 江苏鸿泰钢铁有限公司| 广意永雄机械有限公司| 武汉日晗精密机械有限公司| 天津大强钢铁有限公司| 潍坊沃富机械有限公司| 石家庄美迪机械有限公司| 北京大铭世进机械设备有限公司| 腾达机械设备有限公司| 河北鑫达钢铁有限公司| 宁波甬龙机械有限公司| 东莞市柯达机械有限公司| 新乡市豫新起重机械有限公司 | 机械(苏州)有限公司| 沧州重诺机械制造有限公司| 南通丰威机械有限公司| 无锡宝业机械有限公司| 常州坤世精密机械有限公司 | 四川诚德机械有限公司| 浙江新飞机械有限公司| 宁波震德机械制造有限公司| 南京神鹏机械设备有限公司| 南京 机械有限公司| 景德镇 机械有限公司| 铜陵市富鑫钢铁有限公司| 常州经编机械有限公司| 武汉武建机械施工有限公司| 大连蓝德机械有限公司| 贵州运东机械有限公司| 济南耐刻机械设备有限公司| 上海矿山机械有限公司| 新疆机械设备有限公司| 宁波星箭航天机械有限公司| 浙江志高机械有限公司| 安徽博行机械有限公司| 新宝泰钢铁有限公司| 常州聚武机械有限公司| 上海捷赛机械有限公司| 苏州盛友机械有限公司| 无锡马牌机械有限公司| 无锡胜麦机械有限公司| 徐州压力机械有限公司| 浙江九隆机械有限公司| 金龙机械制造有限公司| 创世纪机械有限公司| 郑州红星机械制造有限公司| 常州凯发动力机械有限公司| 徐州随车起重机有限公司| 河南华北起重吊钩有限公司| 海宁美惠机械有限公司| 沈阳透平机械有限公司| 中山艾能机械有限公司| 汤姆包装机械有限公司| 五矿钢铁上海有限公司| 鑫锐机械设备有限公司| 沂水巨龙机械有限公司| 苏州柯瑞机械有限公司| 贵州机械设备有限公司| 起重机械设备有限公司| 大连宏大连杆机械制造有限公司| 嘉兴市机械有限公司| 北京恒机械有限公司| 广西机械制造有限公司| 陕西 机械有限公司| 创宝包装机械有限公司| 上海盟申机械设备有限公司| 辽阳新达钢铁有限公司| 广东华菱机械有限公司| 诸城市日通机械有限公司| 新麦机械 无锡 有限公司| 海宁亚东机械有限公司| 百超玻璃机械有限公司| 河北东方富达机械有限公司| 山东曲阜机械有限公司| 英国敬业钢铁有限公司| 杭州诺迈机械有限公司| 无锡通用机械厂有限公司| 济南速雕数控机械有限公司 | 常州豪凯机械有限公司| 济宁市福瑞得机械有限公司 | 苏州工业园区机械有限公司| 广东信昌机械有限公司| 新乡市特昌振动机械有限公司| 济南大鹏机械设备有限公司| 江阴博丰钢铁有限公司| 徐州徐工随车起重机有限公司 | 扬州扬宝机械有限公司| 郑州鼎盛机械有限公司| 东台富康机械有限公司| 苏州乐嘉机械有限公司| 厦门东亚机械有限公司| 泰州机械制造有限公司| 济南迈动数控机械有限公司| 兰州长征机械有限公司| 济宁工程机械有限公司| 丰机械有限公司怎么样| 宁波海江机械制造有限公司| 南通国盛精密机械有限公司| 大连世达重工有限公司| 重型工程机械有限公司| 无锡市康晖机械制造有限公司 | 济南精美机械设备有限公司| 青岛华牧机械有限公司| 长沙三一重工有限公司| 河南飞马起重机械有限公司| 杭州胜驰机械有限公司| 上海起重运输机械厂有限公司| 烟台 机械有限公司| 青岛云龙纺织机械有限公司| 旺磐精密机械有限公司| 鞍山重工机械有限公司| 南京泽创机械有限公司| 温州惠利机械有限公司| 昆明 机械制造 有限公司| 银丰弹簧机械设备制造有限公司| 阳煤化工机械有限公司| 山东威力重工机床有限公司| 江苏大圣机械制造有限公司| 东营恒诚机械有限公司| 成机械设备有限公司| 佛山三技精密机械有限公司| 杭州重型机械有限公司| 宜兴市机械有限公司| 北京丰茂植保机械有限公司| 柳州中源机械有限公司| 成机械设备有限公司| 郑州新水工机械有限公司| 青岛非凡包装机械有限公司| 天津市天重江天重工有限公司| 平湖成功机械有限公司| 济南 机械设备有限公司| 常州耐强传动机械有限公司| 工程机械制造有限公司| 长沙熙迈机械制造有限公司| 昆山江锦机械有限公司| 深圳印刷机械深圳有限公司| 山东机械铸造有限公司| 上饶中材机械有限公司| 江阴市博越机械有限公司| 临沂三友重工有限公司| 安徽 机械设备有限公司| 昆山尚亦精密机械有限公司| 集瑞联合重工有限公司| 杭州金鸥机械有限公司| 大连铸鸿机械有限公司| 上海腾迈机械有限公司| 华群数控机械有限公司| 海门亿峰机械有限公司| 嘉兴敏实机械有限公司| 上海博储机械工业有限公司| 盐城市联鑫钢铁有限公司| 潍坊凯隆机械有限公司| 盐城液压机械有限公司| 苏州斗山工程机械有限公司| 大连地拓重工有限公司| 山东翔工机械有限公司| 武汉食品机械有限公司| 东莞市瑞沧机械设备有限公司 | 扬州中孚机械有限公司| 山东力王重工机械有限公司| 成都海科机械设备制造有限公司 | 济南快克数控机械有限公司| 台林机械有限公司 -| 烟台飞达机械设备有限公司| 广州德机械有限公司| 河南朝阳钢铁有限公司| 常州市菲德机械部件有限公司 | 常州小松工程机械有限公司招聘| 张家港海狮洗涤机械有限公司| 陕西金奇机械电器制造有限公司 | 河南起重机械有限公司| 常州 机械制造有限公司| 上海嘉倍德塑胶机械有限公司| 河南省起重机械有限公司| 诸城市安泰机械有限公司| 常州市菲德机械部件有限公司| 天津市钢铁贸易有限公司| 广州佳速精密机械有限公司| 广州汇亿机械有限公司| 常州昊博机械有限公司| 重庆力波机械有限公司| 汉虹精密机械有限公司| 河南人从众机械制造有限公司| 深圳新添润彩印机械设备有限公司| 无锡工程机械有限公司| 陕西重型机械制造有限公司| 华通动力重工有限公司| 河南佳德机械有限公司| 科尼起重机设备(上海)有限公司| 江阴市华科机械设备有限公司| 天津重型机械有限公司| 澳太机械制造有限公司| 广州南头机械有限公司| 斯特机械制造有限公司| 山东创铭机械有限公司| 佛山市机械有限公司| 山西 重工有限公司| 长沙天映机械有限公司| 江苏贝尔机械有限公司| 潍坊凯德塑料机械有限公司| 潍坊浩泰机械有限公司| 湘东化工机械有限公司| 徐工机械有限公司现状| 河北澳金机械设备有限公司| 广州磊蒙机械设备有限公司| 广州市勤达机械设备有限公司 | 南通科邦机械有限公司| 天津石油机械有限公司| 青岛威尔塑料机械有限公司| 中马园林机械有限公司| 安徽国梁机械设备有限公司| 青岛岛宇机械有限公司| 杭州双利机械有限公司| 江苏永立机械有限公司| 川崎精密机械苏州有限公司| 上海金相机械有限公司| 山东祥远机械有限公司| 山东贝特起重机有限公司| 深圳市高郭氏精密机械有限公司 | 山东三牛机械有限公司| 泰富重工制造有限公司| 济南大鹏机械设备有限公司| 泉州市机械有限公司| 广东力丰机械制造有限公司| 淄博联泰机械有限公司| 南海力丰机械有限公司| 宁波久力数控机械有限公司| 台州 机械有限公司| 张家港市塑机械有限公司| 浙江矿山机械有限公司| 京西重工北京有限公司| 济宁鑫聚机械有限公司| 富华重工有限公司老板| 东莞市嘉鲁特注塑机械有限公司| 佛山钢铁贸易有限公司| 塑料包装机械有限公司| 盐城市联鑫钢铁有限公司| 江苏拓威机械有限公司| 济南锐捷机械设备有限公司| 青岛 机械制造有限公司| 南通密炼捏合机械有限公司| 东莞港重机械有限公司| 佛山市创利宝包装机械有限公司| 安徽远鸿机械有限公司| 陀曼精密机械有限公司| 上海京悦机械有限公司| 远东机械设备有限公司| 苏州力强机械制造有限公司| 江阴市江南轻工机械有限公司| 嘉兴 机械有限公司| 佛山市液压机械有限公司| 山东天瑞重工有限公司| 永达机械制造有限公司| 南兴木工机械有限公司| 浙江方邦机械有限公司| 浙江易锋机械有限公司| 新乡市先锋振动机械有限公司| 兄弟机械西安有限公司| 嘉诚机械制造有限公司| 宁波恒阳机械有限公司| 东莞祥艺机械有限公司| 日照钢铁轧钢有限公司| 上海宝峨机械有限公司| 浙江传动机械有限公司| 重庆华世丹机械制造有限公司 | 江阴市机械设备有限公司| 无锡机械制造有限公司| 山东恒旺机械有限公司| 山东巨力机械有限公司| 上海瑞派机械有限公司| 上海卓亚矿山机械有限公司| 浙江富地机械有限公司| 常州金源机械设备有限公司| 众工机械机械有限公司| 北京中车重工机械有限公司| 娄底 机械有限公司| 济南 重工有限公司| 上海纺织机械有限公司| 山东烨辉钢铁有限公司| 沈阳联合利邦机械有限公司| 杭州春江制药机械有限公司| 上海川口机械有限公司| 张家港机械有限公司| 新乡市东振机械制造有限公司| 无锡金球机械有限公司| 东营市机械有限公司| 青岛万邦包装机械有限公司 | 天津安东石油机械制造有限公司| 辽宁三君机械有限公司| 吴江迈锐机械有限公司怎么样| 上海宁金钢铁有限公司| 浙江佳成机械有限公司| 湖南汇杰机械设备有限公司| 浙江风驰机械有限公司| 浙江园林机械有限公司| 济南机械制造有限公司| 济南金梭机械制造有限公司| 佛山市柯田包装机械有限公司| 成都弘林机械有限公司| 青岛机械制造有限公司| 陕西 工程机械有限公司| 石家庄米兹机械设备有限公司| 焦作巨航粮油机械有限公司| 上海万铂起重机械有限公司| 武汉中轻机械有限公司| 海狮洗涤机械有限公司| 德锐尔机械有限公司| 苏州三维精密机械有限公司| 临沂美联重工有限公司| 苏州凯尔博精密机械有限公司| 哈尔滨机械有限公司| 西安亿起来贸易有限公司| 桂林平钢钢铁有限公司| 靖江 机械有限公司| 保定华光机械有限公司| 南京星德机械有限公司| 东莞市瑞沧机械设备有限公司| 南通佳吉机械有限公司| 深圳市稻田包装机械有限公司| 新兴移山天津重工有限公司| 湖南汇杰机械设备有限公司| 东莞机械制造有限公司| 徐州中嘉工程机械有限公司| 无锡振华机械有限公司| 威斯特机械有限公司| 东莞市世翔精密机械制造有限公司| 莱州市鲁樽机械有限公司| 苏州盛友机械有限公司| 广州机械设备制造有限公司| 沈阳六合机械有限公司| 广西五丰机械有限公司| 佛山陶瓷机械有限公司| 广州冠浩机械设备有限公司| 广东宏兴机械有限公司| 青岛武船重工有限公司| 济南大彤机械设备有限公司| 新华起重工具有限公司| 上海百劲机械有限公司| 山东鲁一机械有限公司| 山西翔天钢铁有限公司| 浙江精密机械有限公司| 科润达机械有限公司| 汉中群峰机械制造有限公司 | 沈阳六合机械有限公司| 苏州原禄机械有限公司| 宁波工业机械有限公司| 东莞高盟机械有限公司| 东莞液压机械有限公司| 江阴派格机械设备有限公司| 湖南申德钢铁有限公司| 许昌机械制造有限公司| 烟台海州机械有限公司| 秦皇岛宏兴钢铁有限公司| 上海冉本机械制造有限公司 | 众工机械机械有限公司| 河北州科重工有限公司| 徐州华东机械有限公司| 济南精美机械设备有限公司| 山东愚公工程机械有限公司| 深圳市创世纪机械有限公司| 江苏特佳机械有限公司| 江西欧克机械有限公司| 无锡凯希迪斯机械有限公司| 浩博海门机械有限公司| 广州市善友机械设备有限公司| 潍坊润鑫机械有限公司| 常州起重机械有限公司| 广州机械设备有限公司| 厦门天一精密机械有限公司| 精密机械制造有限公司| 劲源机械设备有限公司| 汕头机械有限公司招聘| 上海精元机械有限公司| 山东鲁成起重机械有限公司| 常州英来机械有限公司| 宁波威恩精密机械有限公司| 湖南星邦重工有限公司| 苏州鹏丰机械元件有限公司| 大连橡胶塑料机械有限公司| 上海嘉倍德塑胶机械有限公司 | 浙江工程机械有限公司| 湖北大展钢铁有限公司| 济南大彤机械设备有限公司 | 兰州长征机械有限公司| 常州纺织机械有限公司| 扬州海沃机械有限公司| 上海霏润机械设备有限公司| 烟台建筑机械有限公司| 广东达诚机械有限公司| 机电设备有限公司起名| 鑫华机械制造有限公司| 安徽唐兴机械装备有限公司| 东莞市力华机械设备有限公司 | 济南帕特机械有限公司| 苏州奥天诚机械有限公司| 贵州机械设备有限公司| 杭州驰丰机械有限公司| 新乡市欧霖佳机械有限公司| 博凯机械上海有限公司| 杭州旭众机械设备有限公司| 山东正丰钢铁有限公司| 新乐华宝塑料机械有限公司| 杭州海兴机械有限公司| 湖南嘉龙机械设备贸易有限公司| 荏原机械淄博有限公司| 杭州化工机械有限公司| 安徽佶龙机械有限公司| 东莞市佐臣自动化机械有限公司| 广州市旭朗机械设备有限公司| 温州科瑞机械有限公司| 四川腾中重工机械有限公司| 苏州拓博机械有限公司| 天工工程机械有限公司| 安瑞科气体机械有限公司| 上海京悦机械有限公司| 东远机械昆山有限公司| 威海美盛机械有限公司| 无锡博雅德精密机械有限公司| 江苏国瑞液压机械有限公司| 南通腾中机械有限公司| 上海福源机械有限公司| 沈阳奎鑫钢铁有限公司| 长春机械设备有限公司| 湖南省湘粮机械制造有限公司 | 河北敬业钢铁有限公司地址| 锦州俏牌机械有限公司| 河南天成矿山起重机有限公司| 东莞市智科精密机械有限公司| 中船华南船舶机械有限公司| 张家港长力机械有限公司| 首钢长白机械有限公司| 恒天九五重工有限公司| 江西中天机械有限公司| 科瑞森机械有限公司| 浙江天风塑料机械有限公司| 富达机械制造有限公司| 苏州五金机械有限公司| 湖南宇泰重工有限公司| 洛北重工机械有限公司| 山东博宇机械有限公司| 上海信烨精密机械有限公司| 成都欧曼机械有限公司| 郑州液压机械有限公司| 河南万合机械有限公司| 宁波海雄塑料机械有限公司| 渤海重工管道有限公司| 浙江铸信机械有限公司| 恒丰机械配件有限公司| 四川久进机械制造有限公司| 山东润通机械制造有限公司| 东莞市世翔精密机械制造有限公司 | 青岛张氏机械有限公司| 上海杉野机械有限公司| 安徽鸿泰钢铁有限公司| 新科起重机有限公司| 深圳新添润彩印机械设备有限公司| 东莞共荣精密机械有限公司| 汕头市伟力塑料机械厂有限公司 | 食品机械设备有限公司| 南京 机械制造有限公司| 上海塑料机械 有限公司| 重型工程机械有限公司| 宣城 机械 有限公司| 天津中核机械有限公司| 长江机械设备有限公司| 南昌中昊机械有限公司| 山推抚起机械有限公司| 凹凸精密机械有限公司| 济宁工程机械有限公司| 江苏古川机械有限公司| 卓郎新疆智能机械有限公司| 山东莱芜煤矿机械有限公司| 洛阳大华重型机械有限公司| 大庆机械制造有限公司| 河南森源重工有限公司| 宿迁机械制造有限公司| 福州 机械 有限公司| 西安华欧精密机械有限公司| 郑州龙阳重型机械设备有限公司| 济南迈动数控机械有限公司| 郑州祥龙建筑机械租赁有限公司| 安阳锻压机械有限公司| 青岛青科重工有限公司| 永盛达机械有限公司| 青岛新东机械有限公司| 安徽 机械制造有限公司| 台进精密机械有限公司| 上海众冠食品机械有限公司| 永宏机械制造有限公司| 沈阳祺盛机械有限公司| 浙江胜祥机械有限公司| 上海中远海运重工有限公司| 台林机械有限公司 -| 上海竹达机械设备有限公司| 安徽国梁机械设备有限公司 | 温岭华驰机械有限公司| 湖南中联陶瓷机械有限公司| 郑州江河重工有限公司| 杭州方圆塑料机械有限公司| 青岛胜代机械有限公司| 上海依澳包装机械有限公司| 青岛华雷重工设备有限公司| 浙江德玛克机械有限公司| 江苏江佳机械有限公司| 天津大强钢铁有限公司| 江苏医疗机械有限公司| 江苏汉庭机械制造有限公司| 江苏力源液压机械有限公司| 安阳斯普机械有限公司| 自贡机械制造有限公司| 江门振达机械有限公司| 佛山创宝包装机械有限公司| 十堰福堰钢铁有限公司| 宝鸡中车时代工程机械有限公司| 建湖华祥机械有限公司| 上海取祥机械有限公司| 武汉中粮机械有限公司| 上海冠龙阀门机械有限公司| 台州宏汇机械有限公司| 江苏腾通包装机械有限公司| 重庆泰诺机械有限公司| 山东包装机械有限公司| 蚌埠柳工机械有限公司| 新马木工机械有限公司| 普瑞特机械有限公司| 苏州市丰科精密机械有限公司| 东莞市今塑精密机械有限公司| 建筑机械设备有限公司| 天津起重机械有限公司| 广州市中铭印刷机械有限公司| 乐星机械无锡有限公司| 深圳市奥德机械有限公司| 群鑫机械有限公司电话| 高博起重设备有限公司| 济宁四通工程机械有限公司| 济宁朝阳机械有限公司| 上海晶程机械有限公司| 宣城市 机械 有限公司| 南京彩途机械设备有限公司 | 南京 机械设备 有限公司| 新疆汇合钢铁有限公司| 兴业机械设备有限公司| 东莞机械制造有限公司| 济南中唐机械设备有限公司| 环保机械制造有限公司| 北京余特包装机械有限公司| 柳州瑞利机械有限公司| 台林机械有限公司 -| 浙江为尚机械有限公司| 招远华丰机械设备有限公司| 东莞住重塑胶机械有限公司| 东源精密机械有限公司| 江苏江成机械有限公司| 上海长江服装机械有限公司| 无锡机械设备有限公司| 江苏国天锻压机械有限公司 | 鞍山宝得钢铁有限公司招聘岗位 | 苏州拓博机械有限公司| 事必得精密机械有限公司| 河北澳金机械设备有限公司 | 洛阳耿力机械有限公司| 湖南德邦重工机械有限公司| 精一机械(中山)有限公司| 山东 钢铁有限公司| 湖北大展钢铁有限公司| 潍坊机械制造有限公司| 山东明美数控机械有限公司| 浙江海蜜机械有限公司| 常州市日中精密机械有限公司| 郑州世纪精信机械制造有限公司 | 青岛机械制造有限公司| 固精密机械有限公司| 科润达机械有限公司| 沈阳三重机械有限公司| 南通中船机械制造有限公司| 山东山推机械有限公司| 曲阜兴运输送机械设备有限公司 | 杭州双林机械有限公司| 厦门大金机械有限公司| 无锡力恩机械有限公司| 纸箱机械制造有限公司| 重庆国杰工程机械有限公司| 江阴市机械设备有限公司| 浙江温兄机械阀业有限公司| 天津海特传动机械有限公司 | 温州 机械有限公司| 随州盛星机械有限公司| 重庆辉昌机械设备有限公司| 无锡机械设备有限公司| 华新机械有限公司官网| 广东正力精密机械有限公司| 张家港白熊科美机械有限公司| 广东明华机械有限公司| 莱州市鲁樽机械有限公司| 东莞市雅康精密机械有限公司 | 机械配件苏州有限公司| 诺尔起重设备有限公司| 三友医疗机械有限公司| 天津宏大纺织机械有限公司| 河北州科重工有限公司| 宁波威恩精密机械有限公司 | 广州工友起重设备制造有限公司| 山东工大机械有限公司| 江西萍乡钢铁有限公司| 唐山丰润区钢铁有限公司| 江苏宏光钢铁有限公司| 苏州德伊捷自动化机械有限公司| 广州市市政工程机械施工有限公司| 洛阳高峰工程机械有限公司| 河南重机械有限公司| 浙江天盛机械有限公司| 无锡联通焊接机械有限公司| 无锡中机械有限公司| 潍坊天洁机械有限公司| 嘉兴瑞宏精密机械有限公司| 工程机械配件有限公司| 青岛欧普机械有限公司| 昆山崇粲机械有限公司| 郑州未来机械制造有限公司| 上海信烨精密机械有限公司| 太平洋机械有限公司| 维特根机械有限公司| 常州市永明机械制造有限公司| 烟台精密机械有限公司| 宁波海雄塑料机械有限公司| 林州中奥机械有限公司| 亚德林机械有限公司| 山东山建机械有限公司| 重庆文安机械有限公司| 佛山市科鹰机械有限公司| 山矿机械设备有限公司| 迪砂常州机械有限公司| 河南点赞钢铁有限公司| 广州冠浩机械设备有限公司| 徐工机械有限公司现状| 商丘 机械设备有限公司| 华宇机械制造有限公司| 宁波安德机械有限公司| 铁建重工包头有限公司| 河南通达重工有限公司| 畜牧机械设备有限公司| 上海机械施工有限公司| 郑州祥龙建筑机械租赁有限公司| 苏州旭隆机械有限公司| 江苏化工机械有限公司| 江阴凯迈机械有限公司| 禹城益佳机械有限公司| 江苏方圣机械有限公司| 上海霏润机械设备有限公司| 汉邦机械制造有限公司| 安丘机械制造有限公司| 浙江长泰机械有限公司| 振华真空机械有限公司| 苏州三维精密机械有限公司| 浙江天风塑料机械有限公司| 杭州杭重机械有限公司| 邯郸包装机械有限公司| 山东鲁新起重设备有限公司| 福州展志钢铁有限公司| 武汉日晗精密机械有限公司 | 禹城市华普机械设备有限公司| 宁波 机械有限公司| 杭州杭奥机械有限公司| 山西建龙钢铁有限公司| 宁波华热机械制造有限公司| 东方液压机械有限公司| 天津亨旺机械有限公司| 宁波佳诚机械有限公司| 柳州高华机械有限公司| 广州华臻机械设备有限公司| 合肥逸飞包装机械有限公司| 大连地拓重工有限公司怎么样| 大明钢铁实业有限公司| 新乡市海纳筛分机械制造有限公司 | 南京益腾机械制造有限公司| 北京 机械 有限公司| 安庆市机械有限公司| 天津市机械设备有限公司| 临沂机械设备有限公司| 广州东升机械有限公司| 龙工江西机械有限公司| 郑州博源机械有限公司| 杭州神钢建设机械有限公司| 龙海起重工具有限公司| 宁波力源机械有限公司| 常州凯发动力机械有限公司| 邢台德龙钢铁有限公司招聘| 南阳医疗机械有限公司| 河南茂盛机械制造有限公司| 无锡鹰贝机械有限公司| 武汉金火旺机械设备有限公司| 中山市信元铝门窗机械制造有限公司 | 新昌县机械有限公司| 重庆宏塑机械有限公司| 世翔精密机械制造有限公司| 浙江美华包装机械有限公司| 山西中德科工机械制造有限公司 | 江苏铁本钢铁有限公司| 浙江长泰机械有限公司| 江苏申特钢铁有限公司| 石家庄嘉祥精密机械有限公司 | 河南安普包装机械制造有限公司 | 维特根机械有限公司| 河北德林机械有限公司| 江门市机械有限公司| 三菱重工空调有限公司| 郑州机械设备有限公司| 滨州 机械 有限公司| 昆山机械设备有限公司| 南宁敏创机械有限公司| 南京登峰起重设备制造有限公司 | 开封茂盛机械有限公司| 扬州福尔喜果蔬汁机械有限公司| 卓郎新疆智能机械有限公司| 张市机械机械有限公司| 兰州 机械 有限公司| 上海宇减传动机械有限公司 | 江苏沃得农业机械有限公司| 东莞市工业机械有限公司| 机械有限公司 衢州| 苏州阿姆斯壮阀门机械有限公司 | 常州市良久机械制造有限公司| 上海文胜机械设备有限公司| 路通重工机械有限公司| 台州市双辉机械设备有限公司| 江苏迎阳无纺机械有限公司| 宁波北仑 机械有限公司| 湖南嘉龙机械设备贸易有限公司 | 杭州海兴机械有限公司| 上海起帆电缆有限公司| 上海 钢铁物资有限公司| 传动机械设备有限公司| 苏州阔泽精密机械有限公司 | 河北工程机械有限公司| 徐州智茸工程机械有限公司| 速技能机械有限公司| 盐城机械制造有限公司| 慈溪机械设备有限公司| 锦辉五金机械有限公司| 烟台宏兴机械有限公司| 飞迈烟台机械有限公司| 扬州液压机械有限公司| 佛山市三良机械设备有限公司| 芜湖机械制造有限公司| 洛阳中收机械装备有限公司招聘| 东莞丰堡精密机械有限公司 | 东莞仕能机械设备有限公司| 新科起重机有限公司| 上海 起重设备有限公司| 珠海飞马传动机械有限公司| 濮阳机械制造有限公司| 长春机械制造有限公司| 大京机械山东有限公司| 北京长空机械有限公司| 无锡大昌机械工业有限公司| 江苏鼎盛重工有限公司| 淮安机械制造有限公司| 温州中环机械设备有限公司| 苏州原禄机械有限公司| 济南建设机械有限公司| 宏达机械制造有限公司| 苏州拓博机械有限公司| 山东云光钢铁有限公司| 青岛希世可机械有限公司 | 力顺源机械有限公司| 江苏迪鼎机械有限公司| 诸城市志诺机械有限公司| 温州市兴业机械设备有限公司| 恒兴机械设备有限公司| 安徽中科光电色选机械有限公司 | 贵州力顺机械有限公司| 武汉船用机械有限公司| 普特工程机械有限公司| 奉化南方机械有限公司| 浙江汉达机械有限公司| 广州田田机械有限公司| 温州镇田机械有限公司| 长葛市机械有限公司| 青岛美克精密机械有限公司| 山东泰瑞汽车机械电器有限公司| 江苏久盛机械设备有限公司| 澳太机械制造有限公司| 东莞%机械制造有限公司| 曲阜兴运输送机械设备有限公司 | 深圳市丹耐斯机械有限公司| 大连宏大连杆机械制造有限公司| 爱立许机械有限公司| 佛山市松川机械设备有限公司| 曲阜兴运输送机械设备有限公司| 浙江君鸿机械有限公司| 龙文机械设备有限公司| 绍兴三纺机械有限公司| 湖北 机械制造有限公司| 宁波人和机械轴承有限公司| 东莞市锋机械有限公司| 福建海源机械有限公司| 首唐宝生钢铁有限公司| 河北小松工程机械贸易有限公司| 南京力霸起重设备机械有限公司| 青州神工机械有限公司| 宁波利豪机械有限公司| 宏兴钢铁有限公司官网| 唐山瑞兴钢铁有限公司| 河南启瀚机械设备有限公司| 福建信达机械有限公司| 合肥浩凯机械有限公司| 上海永德食品机械有限公司| 北京龙泰机械设备安装有限公司 | 上海钢铁贸易有限公司| 武汉中轻机械有限公司| 河南通达重工有限公司| 宁波人和机械轴承有限公司|