{"id":2022,"date":"2017-09-16T22:57:09","date_gmt":"2017-09-16T20:57:09","guid":{"rendered":"https:\/\/guven.atbakan.com\/blog\/?p=2022"},"modified":"2017-09-16T22:59:14","modified_gmt":"2017-09-16T20:59:14","slug":"trait-nedir","status":"publish","type":"post","link":"https:\/\/guven.atbakan.com\/blog\/tr\/trait-nedir\/","title":{"rendered":"Trait Nedir?"},"content":{"rendered":"<p>Bir \u00f6nceki yaz\u0131mda, yazd\u0131\u011f\u0131m kodda s\u00fcrekli tekrar eden kod par\u00e7as\u0131n\u0131 Trait i\u00e7ine al\u0131p, g\u00fczelle\u015ftirdi\u011fimi iddia etmi\u015ftim. Peki kodu g\u00fczelle\u015ftirdi\u011fimi iddia etti\u011fim bu trait tam olarak nedir?<\/p>\n<p>Kelime anlam\u0131na bakt\u0131\u011f\u0131m\u0131zda, trait; bir ki\u015finin karakteristik \u00f6zelli\u011fi anlam\u0131na gelir. Birebir \u00e7evirdi\u011fimizde ise \u00f6zellik, ki\u015fisel \u00f6zellik diyebiliriz. Programlama \u00f6zelinde bakt\u0131\u011f\u0131m\u0131zda ise, bir s\u0131n\u0131fa \u00f6zellik\/yetenek y\u00fcklemek i\u00e7in kullan\u0131lan kod diyebiliriz.<\/p>\n<p>PHP&#8217;de bir s\u0131n\u0131f, yaln\u0131zca bir \u00fcst s\u0131n\u0131fa sahip olabilir. Daha anla\u015f\u0131l\u0131r bir deyi\u015fle, &#8220;bir s\u0131n\u0131f yaln\u0131zca tek bir s\u0131n\u0131ftan t\u00fcretilebilir(extend edilebilir)&#8221;. S\u0131n\u0131ftan t\u00fcretme i\u015flemini, genellikle t\u00fcretilen s\u0131n\u0131f\u0131n \u00f6zelliklerini(fonksiyonlar\u0131n\/methodlar\u0131n\u0131\/de\u011fi\u015fkenlerini) kullanabilmek i\u00e7in yapar\u0131z.<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n\r\nclass Admin extends User {}\r\n\r\nclass Admin extends User, Human {} \/\/b\u00f6yle bir kullan\u0131m yok<\/pre>\n<p>Fakat zaman zaman yazd\u0131\u011f\u0131m\u0131z s\u0131n\u0131f\u0131n, birden fazla s\u0131n\u0131f\u0131n \u00f6zelliklerine sahip olmas\u0131 gerekti\u011fini g\u00f6r\u00fcr\u00fcz. Yukar\u0131daki \u00f6rnekte g\u00f6rd\u00fc\u011f\u00fcm\u00fcz \u00fczre, Admin s\u0131n\u0131f\u0131m\u0131z User s\u0131n\u0131f\u0131ndan t\u00fcretilmi\u015f. User&#8217;\u0131n t\u00fcm \u00f6zelliklerini kullanabilece\u011fiz demektir. Fakat ayn\u0131 zamanda Human s\u0131n\u0131f\u0131n\u0131n da \u00f6zelliklerine sahip olmas\u0131n\u0131 istiyoruz. \u0130kinci sat\u0131rdaki kullan\u0131m m\u00fcmk\u00fcn de\u011fil.<\/p>\n<p>PHP 5.4 ile hayat\u0131m\u0131za dahil olan traitler, bu duruma bir nebze \u00e7\u00f6z\u00fcm olabilmektedir. Tabi tek amac\u0131 buna \u00e7\u00f6z\u00fcm olmak de\u011fildir. Ayn\u0131 zamanda kod tekrar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7mek konusunda bize olduk\u00e7a yard\u0131mc\u0131 olur ki, bir \u00f6nceki yaz\u0131mda Trait kullanarak tam olarak bunu hedeflemi\u015ftim.<\/p>\n<h2>Traitlere bir bak\u0131\u015f atal\u0131m:<\/h2>\n<pre class=\"lang:default decode:true \">&lt;?php\r\n\r\ntrait ValidatesRequests {\r\n   \r\n    public function validate($data)\r\n    {\r\n        \/\/parametre olarak g\u00f6nderilen veriyi burada validate edelim.\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>Bir trait, abstract class gibi i\u015flem g\u00f6r\u00fcr. Yani bir traitten yeni bir obje olu\u015fturamazs\u0131n\u0131z. <code>new ValidatesRequests()<\/code> i\u015fe yaramaz. Traitleri bir s\u0131n\u0131f\u0131 i\u00e7erisinde ise, <code>Use<\/code> keywordu ile kullan\u0131r\u0131z.<\/p>\n<pre class=\"lang:default decode:true\">&lt;?php \r\n\r\nclass BilmemneController {\r\n \r\n    use ValidatesRequests;\r\n\r\n    public function deneme()\r\n    {\r\n         $data = ['test']\r\n         $this-&gt;validate($data);\r\n    }\r\n\r\n}<\/pre>\n<p>Yukar\u0131daki \u00f6rnekte a\u00e7\u0131k\u00e7a g\u00f6r\u00fclece\u011fi gibi, ValidatesRequests traitini use ile dahil ettik. Ve deneme fonksiyonumuz i\u00e7inde, traitte tan\u0131mlad\u0131\u011f\u0131m\u0131z validate methodunu kullanabilir duruma geldik.<\/p>\n<p>\u00c7al\u0131\u015fma mant\u0131\u011f\u0131n\u0131 ise kopyala yap\u0131\u015ft\u0131r gibi d\u00fc\u015f\u00fcnebiliriz. Traiti s\u0131n\u0131fa dahil etti\u011fimiz anda, i\u00e7erisindeki methodlar\u0131 sanki dahil etti\u011fimiz s\u0131n\u0131fa kopyalay\u0131p yap\u0131\u015ft\u0131r\u0131yormu\u015f gibi d\u00fc\u015f\u00fcn\u00fcn. \u00d6rne\u011fin bu validate methodunu 5 controller dosyas\u0131nda kullanaca\u011f\u0131m\u0131z\u0131 varsayal\u0131m.<\/p>\n<p>Her bir dosyaya ayn\u0131 methodu kopyalamak yerine, bu 5 s\u0131n\u0131fa traiti dahil ediyoruz. B\u00f6ylece kod tekrar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7iyoruz. Ve tabii ki yazd\u0131\u011f\u0131m\u0131z kodun bak\u0131m\u0131\/tekrar \u00e7ok daha kolay oluyor.<\/p>\n<h2>Traitlerin isimlendirilmesi<\/h2>\n<p>Genelde bu tarz bir paragraf g\u00f6remezsiniz fakat ben olduk\u00e7a \u00f6nemsiyorum. Trait kullan\u0131m\u0131 Laravel&#8217;de yo\u011fun ve bence Laravel isimlendirme konusunda olduk\u00e7a ba\u015far\u0131l\u0131. Traitlerin karakteristik\/ki\u015fisel \u00f6zellik anlam\u0131nda geldi\u011fini s\u00f6ylemi\u015ftik. Trait, kullan\u0131lan s\u0131n\u0131fa yeni \u00f6zellikler katar. Laravel&#8217;in Controller \u00f6rne\u011fine bakal\u0131m. 2 trait kullan\u0131l\u0131yor:<br \/>\n<code>use <a href=\"https:\/\/github.com\/laravel\/framework\/blob\/5.5\/src\/Illuminate\/Foundation\/Auth\/Access\/AuthorizesRequests.php\">AuthorizesRequests<\/a>, <a href=\"https:\/\/github.com\/laravel\/framework\/blob\/5.5\/src\/Illuminate\/Foundation\/Validation\/ValidatesRequests.php\">ValidatesRequests<\/a>;<\/code><br \/>\nBir controllera bu 2 traiti dahil etti\u011fimizde insan dilinde(ama t\u00fcrk\u00e7e de\u011fil) \u015fu c\u00fcmleleri kurabiliyoruz:<\/p>\n<p>&#8220;Bu controller, requestleri(istekleri) authorize eder(yetkilerini onaylar).&#8221;<br \/>\n&#8220;Bu controller, requestleri(isteklerin) validate eder(ge\u00e7erlili\u011fini kontrol eder).&#8221;<\/p>\n<p>Bu iki traiti detayl\u0131ca inceledi\u011fimizde birisinde authorization ile ilgili methodlar\u0131n, di\u011ferinde ise validation ile ilgili methodlar\u0131n bulundu\u011funu g\u00f6r\u00fcrs\u00fcn\u00fcz. Yaz\u0131l\u0131mda en zor \u015feylerden birisi isimlendirmedir, malumunuz. Ne kadar insan diline yak\u0131n isimler verebilirseniz, o kadar ba\u015far\u0131l\u0131 olursunuz (bence).<\/p>\n<p>Sevgiyle kal\u0131n.<\/p>\n<pre class=\"lang:default decode:true crayon-selected\">&lt;?php\r\ntrait Love()\r\n{\r\n    public function love(Human $human) {\r\n\r\n    }\r\n}\r\n\r\ntrait Hate()\r\n{\r\n    public function hate(Human $human) {\r\n\r\n    }\r\n}\r\n\r\nclass Human()\r\n{\r\n    use Love;\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bir \u00f6nceki yaz\u0131mda, yazd\u0131\u011f\u0131m kodda s\u00fcrekli tekrar eden kod par\u00e7as\u0131n\u0131 Trait i\u00e7ine al\u0131p, g\u00fczelle\u015ftirdi\u011fimi iddia etmi\u015ftim. Peki kodu g\u00fczelle\u015ftirdi\u011fimi iddia etti\u011fim bu trait tam olarak nedir? Kelime anlam\u0131na bakt\u0131\u011f\u0131m\u0131zda, trait; bir ki\u015finin karakteristik \u00f6zelli\u011fi anlam\u0131na gelir. Birebir \u00e7evirdi\u011fimizde ise \u00f6zellik, ki\u015fisel \u00f6zellik diyebiliriz. Programlama \u00f6zelinde bakt\u0131\u011f\u0131m\u0131zda ise, bir s\u0131n\u0131fa \u00f6zellik\/yetenek y\u00fcklemek i\u00e7in kullan\u0131lan kod diyebiliriz. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4],"tags":[372,370,371],"class_list":["post-2022","post","type-post","status-publish","format-standard","hentry","category-yazilim","tag-php-de-trait-nedir","tag-php-trait","tag-trait-nedir"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_likes_enabled":true,"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/comments?post=2022"}],"version-history":[{"count":3,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2022\/revisions"}],"predecessor-version":[{"id":2025,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2022\/revisions\/2025"}],"wp:attachment":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/media?parent=2022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/categories?post=2022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/tags?post=2022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}