InterfacedanTrait 77
1 <?php 2
3 //filename: Hewan/NamaHewan.php 4
5 namespace Hewan;
6
7 trait NamaHewan 8 {
9 protected $namaHewan;
10
11 public function setName($name)
12 {
13 $this->namaHewan = $name;
14 }
15
16 public function getName()
17 {
18 return $this->namaHewan;
19 }
20 }
Dari contoh diatas, dapat kita pahami bahwatrait danclasstidak jauh berbeda. Yang membedakan adalah bahwa semua method dalamtrait harusnon-abstract method. Selain itu,trait juga tidak boleh memilikiconstanta.
Didalamtraitkita dapat membuatpropertydengan visibilitas yang dapat kita set sesuai dengan kebutuhan kita.
Untuk memangiltraitkita menggunakankeywordusenamun dari dalamclassseperti contoh dibawah ini:
InterfacedanTrait 79
1 <?php 2
3 //filename: Hewan/Kambing.php 4
5 namespace Hewan;
6
7 class Kambing implements Hewan 8 {
9 use NamaHewan;//ini memanggil trait 10
11 public function __construct()
12 {
13 $this->setName('Kambing');
14 }
15 }
Dengan pemanggil yang sama, jika kita menjalankanfilepemanggil tersebut, makaoutput-nya adalah sebagai berikut:
Trait
Tidak ada bedanya memang, hanya saja sekarang kita menggu- nakantraituntuk padaclassKambingseperti pada contoh diatas.
Karena trait seperti potongan puzzle, maka konsep ini sangat powerfuljika digunakan dengan benar. Selain itu jugatrait sangat reusekarena sifatnya yang seperti potonganpuzzletadi.
Sebenarnya, penggunaantrait sangat banyak sekali modelnya jika kita merujuk pada dokumentasi resminya¹⁰. Namun untuk men-
¹⁰http://php.net/manual/en/language.oop5.traits.php
gurangi kompleksitas, ada baiknya Anda tidak menggunakannya secara berlebihan.
Saya pribadi lebih menggunakan trait sebagai utilities daripada fitur utama dari sebuahproject.Traitsaya gunakan bersamainter- facedimaaninterfacesebagai pengikatnya sedangkantraitsebagai interface aware-nya.
Sebagai contoh berikut:
1 <?php 2
3 /*
4 * This file is part of the SymfonyIdAdminBundle packag\
5 e.
6 *
7 * (c) Muhammad Surya Ihsanuddin <surya.kejawen@gmail.c\
8 om>
9 *
10 * For the full copyright and license information, plea\
11 se view the LICENSE
12 * file that was distributed with this source code.
13 */
14
15 namespace SymfonyId\AdminBundle\Configuration;
16
17 use Symfony\Component\HttpKernel\KernelInterface;
18 use SymfonyId\AdminBundle\Cache\CacheHandler;
19 20 /**
21 * @author Muhammad Surya Ihsanuddin <surya.kejawen@gma\
22 il.com>
23 */
24 trait ConfigurationAwareTrait 25 {
26 /**
InterfacedanTrait 81
27 * @var CacheHandler
28 */
29 protected $cacheHandler;
30
31 /**
32 * @var ConfiguratorFactory
33 */
34 protected $configuratorFactory;
35
36 /**
37 * @var KernelInterface
38 */
39 protected $kernel;
40
41 /**
42 * @param CacheHandler $cacheHandler
43 */
44 public function setCacheHandler(CacheHandler $cache\
45 Handler)
46 {
47 $this->cacheHandler = $cacheHandler;
48 }
49
50 /**
51 * @param ConfiguratorFactory $configuratorFactory
52 */
53 public function setConfiguratorFactory(Configurator\
54 Factory $configuratorFactory)
55 {
56 $this->configuratorFactory = $configuratorFacto\
57 ry;
58 }
59
60 /**
61 * @param KernelInterface $kernel
62 */
63 public function setKernel(KernelInterface $kernel)
64 {
65 $this->kernel = $kernel;
66 }
67
68 /**
69 * @param string $controllerClass
70 *
71 * @return ConfiguratorFactory
72 */
73 public function getConfiguratorFactory($controllerC\
74 lass)
75 {
76 if (!$this->isProduction()) {
77 return $this->configuratorFactory;
78 }
79
80 $this->configuratorFactory = $this->fetchFromCa\
81 che($controllerClass);
82
83 return $this->configuratorFactory;
84 }
85
86 /**
87 * @param string $controllerClass
88 *
89 * @return ConfiguratorFactory
90 */
91 private function fetchFromCache($controllerClass)
92 {
93 $reflectionController = new \ReflectionClass($c\
94 ontrollerClass);
95 if (!$this->cacheHandler->hasCache($reflectionC\
96 ontroller)) {
InterfacedanTrait 83
97 //It's impossible but we need to prevent an\
98 d make sure it is not throwing an exception 99 return $this->configuratorFactory;
100 }
101
102 return $this->bind(require $this->cacheHandler-\
103 >loadCache($reflectionController));
104 }
105
106 /**
107 * @param ConfiguratorInterface[] $configurations
108 *
109 * @return ConfiguratorFactory
110 */
111 private function bind(array $configurations)
112 {
113 $configuratorFactory = clone $this->configurato\
114 rFactory;
115
116 if (isset($configurations['crud'])) {
117 /** @var CrudConfigurator $crudConfigurator\
118 */
119 $crudConfigurator = $configuratorFactory->g\
120 etConfigurator(CrudConfigurator::class);
121 $crudConfigurator->setCrud($configurations[\
122 'crud']);
123 $configuratorFactory->addConfigurator($crud\
124 Configurator);
125 }
126
127 if (isset($configurations['driver'])) {
128 /** @var DriverConfigurator $driverConfigur\
129 ator */
130 $driverConfigurator = $configuratorFactory-\
131 >getConfigurator(DriverConfigurator::class);
132 $driverConfigurator->setDriver($configurati\
133 ons['driver']);
134 $configuratorFactory->addConfigurator($driv\
135 erConfigurator);
136 }
137
138 if (isset($configurations['grid'])) {
139 /** @var GridConfigurator $gridConfigurator\
140 */
141 $gridConfigurator = $configuratorFactory->g\
142 etConfigurator(GridConfigurator::class);
143 $gridConfigurator->setGrid($configurations[\
144 'grid']);
145 $configuratorFactory->addConfigurator($grid\
146 Configurator);
147 }
148
149 if (isset($configurations['page'])) {
150 /** @var PageConfigurator $pageConfigurator\
151 */
152 $pageConfigurator = $configuratorFactory->g\
153 etConfigurator(PageConfigurator::class);
154 $pageConfigurator->setPage($configurations[\
155 'page']);
156 $configuratorFactory->addConfigurator($page\
157 Configurator);
158 }
159
160 if (isset($configurations['plugin'])) {
161 /** @var PluginConfigurator $pluginConfigur\
162 ator */
163 $pluginConfigurator = $configuratorFactory-\
164 >getConfigurator(PluginConfigurator::class);
165 $pluginConfigurator->setPlugin($configurati\
166 ons['plugin']);
InterfacedanTrait 85
167 $configuratorFactory->addConfigurator($plug\
168 inConfigurator);
169 }
170
171 if (isset($configurations['security'])) {
172 /** @var SecurityConfigurator $securityConf\
173 igurator */
174 $securityConfigurator = $configuratorFactor\
175 y->getConfigurator(SecurityConfigurator::class);
176 $securityConfigurator->setSecurity($configu\
177 rations['security']);
178 $configuratorFactory->addConfigurator($secu\
179 rityConfigurator);
180 }
181
182 if (isset($configurations['util'])) {
183 /** @var UtilConfigurator $utilConfigurator\
184 */
185 $utilConfigurator = $configuratorFactory->g\
186 etConfigurator(UtilConfigurator::class);
187 $utilConfigurator->setUtil($configurations[\
188 'util']);
189 $configuratorFactory->addConfigurator($util\
190 Configurator);
191 }
192
193 return $configuratorFactory;
194 }
195
196 /**
197 * @return bool
198 */
199 private function isProduction()
200 {
201 if ('prod' === strtolower($this->kernel->getEnv\
202 ironment())) {
203 return true;
204 }
205
206 return false;
207 }
208 }
Traitdiatas adalahawaredariinterfaceberikut:
1 <?php 2
3 /*
4 * This file is part of the SymfonyIdAdminBundle packag\
5 e.
6 *
7 * (c) Muhammad Surya Ihsanuddin <surya.kejawen@gmail.c\
8 om>
9 *
10 * For the full copyright and license information, plea\
11 se view the LICENSE
12 * file that was distributed with this source code.
13 */
14
15 namespace SymfonyId\AdminBundle\Configuration;
16
17 use Symfony\Component\HttpKernel\KernelInterface;
18 use SymfonyId\AdminBundle\Cache\CacheHandler;
19 20 /**
21 * @author Muhammad Surya Ihsanuddin <surya.kejawen@gma\
22 il.com>
23 */
24 interface ConfigurationAwareInterface
InterfacedanTrait 87
25 {
26 /**
27 * @param CacheHandler $cacheHandler
28 */
29 public function setCacheHandler(CacheHandler $cache\
30 Handler);
31
32 /**
33 * @param ConfiguratorFactory $configuratorFactory
34 */
35 public function setConfiguratorFactory(Configurator\
36 Factory $configuratorFactory);
37
38 /**
39 * @param KernelInterface $kernel
40 */
41 public function setKernel(KernelInterface $kernel);
42
43 /**
44 * @param string $controllerClass
45 *
46 * @return ConfiguratorFactory
47 */
48 public function getConfiguratorFactory($controllerC\
49 lass);
50 }
Anda tidak perlu bingung tentang bariscodediatas karena memang tidak ada hubungannya dengan pembahasan yang sekarang. Saya hanya ingin menunjukkan kepada Anda bahwa pada prakteknya, sebaiknya trait dipakai bersama dengan interface untuk mengu- rangi kompleksitascode.
Penulisantrait yang sepakati adalah diakhiri dengansurfix Trait sehingga seharusnyatraitNamaHewanditulis denganNamaHewanTrait.
I. Pengantar
Pada pemrograman berbasis object, segala sesuatu harus dapat dimodelkan menjadi class dan dapat diinstansiasi. Konsep static adalah sebuah mekanisme untuk keluar dari aturan OOP tersebut.
Maksud keluar dari aturan OOP adalah bahwamethod atauprop- erty yang dilabeli static, ketika memanggilnya kita tidak perlu melakukan instansiasi terlebih dahulu.