• Tidak ada hasil yang ditemukan

Trait

Dalam dokumen Buku Belajar Santai OOP PHP (Halaman 84-95)

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.

Dalam dokumen Buku Belajar Santai OOP PHP (Halaman 84-95)

Dokumen terkait