{"id":32722,"date":"2025-10-25T06:01:38","date_gmt":"2025-10-25T03:01:38","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/"},"modified":"2025-10-25T06:01:38","modified_gmt":"2025-10-25T03:01:38","slug":"php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/","title":{"rendered":"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18"},"content":{"rendered":"<p>PHP&#8217;de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin &#8220;ayn\u0131&#8221; olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde, PHP&#8217;deki <code>==<\/code> ve <code>===<\/code> operat\u00f6rlerinin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine inceleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6rnekler sunacak ve performans ipu\u00e7lar\u0131yla bilginizi peki\u015ftirece\u011fiz. Bu sayede, uygulaman\u0131zda do\u011fru ve g\u00fcvenilir nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131 yaparak olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebileceksiniz.<\/p>\n<p>PHP&#8217;de nesnelerle \u00e7al\u0131\u015f\u0131rken, iki farkl\u0131 nesne de\u011fi\u015fkeninin ayn\u0131 objeyi mi i\u015faret etti\u011fini yoksa sadece benzer i\u00e7eri\u011fe mi sahip oldu\u011funu anlamak s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir durumdur. Bu ayr\u0131m, uygulaman\u0131z\u0131n mant\u0131\u011f\u0131n\u0131 do\u011fru kurmak ve hatalardan ka\u00e7\u0131nmak i\u00e7in hayati \u00f6neme sahiptir. Nesne e\u015fitli\u011fi kavram\u0131, primitif veri tiplerindeki (say\u0131lar, dizeler) e\u015fitlikten \u00e7ok daha karma\u015f\u0131kt\u0131r \u00e7\u00fcnk\u00fc nesneler hem referans hem de de\u011fere dayal\u0131 \u00f6zellikler ta\u015f\u0131r. Bu b\u00f6l\u00fcmde, PHP&#8217;nin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda kulland\u0131\u011f\u0131 temel mekanizmalar\u0131, yani referans ve de\u011fer e\u015fitli\u011fini detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h3>Referans ve De\u011fer E\u015fitli\u011fi Ayr\u0131m\u0131<\/h3>\n<p>Programlama dillerinde nesnelerle \u00e7al\u0131\u015f\u0131rken &#8220;referans&#8221; ve &#8220;de\u011fer&#8221; kavramlar\u0131 temel farkl\u0131l\u0131klar\u0131 temsil eder. Bir de\u011fi\u015fkenin bir nesneyi &#8220;referans&#8221; etmesi, o de\u011fi\u015fkenin asl\u0131nda nesnenin bellekteki adresini tuttu\u011fu anlam\u0131na gelir. Dolay\u0131s\u0131yla, birden fazla de\u011fi\u015fken ayn\u0131 nesne referans\u0131n\u0131 tutabilir ve bu de\u011fi\u015fkenlerden biri \u00fczerinden nesnede yap\u0131lan bir de\u011fi\u015fiklik, di\u011fer t\u00fcm referanslar taraf\u0131ndan da g\u00f6r\u00fclebilir. \u00d6rne\u011fin, bir &#8220;Kullan\u0131c\u0131&#8221; nesnesi olu\u015fturdu\u011funuzda ve bunu ba\u015fka bir de\u011fi\u015fkene atad\u0131\u011f\u0131n\u0131zda, asl\u0131nda ayn\u0131 kullan\u0131c\u0131n\u0131n bellekteki tek bir \u00f6rne\u011fine i\u015faret ediyorsunuzdur. Bu durum, nesnelerin haf\u0131za y\u00f6netimi ve performans a\u00e7\u0131s\u0131ndan olduk\u00e7a \u00f6nemlidir, zira her de\u011fi\u015fken i\u00e7in ayr\u0131 bir nesne kopyas\u0131 olu\u015fturmaktan ka\u00e7\u0131nm\u0131\u015f olursunuz.<\/p>\n<p>Di\u011fer yandan, &#8220;de\u011fer e\u015fitli\u011fi&#8221; ise iki nesnenin i\u00e7eri\u011finin, yani \u00f6zelliklerinin ve de\u011ferlerinin birebir ayn\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Bu durumda, nesneler bellekte farkl\u0131 konumlarda bulunuyor olsalar bile, i\u00e7lerindeki veriler ayn\u0131ysa &#8220;de\u011fer olarak e\u015fit&#8221; kabul edilebilirler. \u00d6rne\u011fin, iki ayr\u0131 &#8220;\u00dcr\u00fcn&#8221; nesnesinin ayn\u0131 ad, fiyat ve stok koduna sahip olmas\u0131, de\u011fer e\u015fitli\u011fini sa\u011flar. Ancak, bunlar h\u00e2l\u00e2 iki farkl\u0131 \u00fcr\u00fcn \u00f6rne\u011fidir ve birindeki de\u011fi\u015fiklik di\u011ferini etkilemez. PHP&#8217;de bu iki farkl\u0131 kar\u015f\u0131la\u015ft\u0131rma t\u00fcr\u00fc i\u00e7in ayr\u0131 operat\u00f6rler bulunur ve hangisini se\u00e7ece\u011finiz, kar\u015f\u0131la\u015ft\u0131rman\u0131n amac\u0131na g\u00f6re de\u011fi\u015fir. Bu ayr\u0131m\u0131 do\u011fru anlamak, kodunuzda do\u011fru kararlar vermenizi ve beklenmedik davran\u0131\u015flardan ka\u00e7\u0131nman\u0131z\u0131 sa\u011flar.<\/p>\n<h3><code>==<\/code> Operat\u00f6r\u00fc: De\u011fer Kar\u015f\u0131la\u015ft\u0131rmas\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>PHP&#8217;de <code>==<\/code> (e\u015fitlik) operat\u00f6r\u00fc, nesneleri kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in kullan\u0131ld\u0131\u011f\u0131nda basit veri tiplerinden farkl\u0131 bir davran\u0131\u015f sergiler. Bu operat\u00f6r, &#8220;de\u011fer kar\u015f\u0131la\u015ft\u0131rmas\u0131&#8221; yapar. Yani, iki nesnenin ayn\u0131 s\u0131n\u0131ftan olup olmad\u0131\u011f\u0131n\u0131 ve ayn\u0131 \u00f6zelliklere (property) ayn\u0131 de\u011ferlerle sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Nesnelerin bellekteki konumlar\u0131 veya birbirlerine referans edip etmedikleri \u00f6nemli de\u011fildir; sadece i\u00e7lerindeki verilerin ayn\u0131 olup olmad\u0131\u011f\u0131na bakar. E\u011fer iki nesne, ayn\u0131 s\u0131n\u0131f\u0131n \u00f6rnekleri ise ve t\u00fcm eri\u015filebilir \u00f6zelliklerinin de\u011ferleri e\u015fle\u015fiyorsa, <code>==<\/code> operat\u00f6r\u00fc <code>true<\/code> d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Bu durum, \u00f6zellikle veritaban\u0131ndan \u00e7ekilen iki farkl\u0131 nesne \u00f6rne\u011finin ayn\u0131 veriyi temsil edip etmedi\u011fini kontrol etmek istedi\u011finiz senaryolarda olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. Diyelim ki, iki farkl\u0131 sorguyla ayn\u0131 ID&#8217;ye sahip iki kullan\u0131c\u0131 nesnesi \u00e7ektiniz. Bunlar bellekte farkl\u0131 adreslerde bulunacak olsa da, i\u00e7erikleri (ad, soyad, e-posta gibi) ayn\u0131ysa <code>==<\/code> operat\u00f6r\u00fc size <code>true<\/code> d\u00f6necektir. Ancak, bu operat\u00f6r, nesnenin \u00f6zel (private) veya korumal\u0131 (protected) \u00f6zelliklerini de dikkate al\u0131r; yani bu \u00f6zelliklerin de ayn\u0131 olmas\u0131 gerekir. Bu, baz\u0131 durumlarda bekledi\u011finizden daha kat\u0131 bir kar\u015f\u0131la\u015ft\u0131rma anlam\u0131na gelebilir. Ayr\u0131ca, e\u011fer nesnelerden birinde di\u011ferinde olmayan bir \u00f6zellik varsa veya \u00f6zellik de\u011ferleri farkl\u0131ysa, <code>==<\/code> operat\u00f6r\u00fc <code>false<\/code> d\u00f6nd\u00fcrecektir.<\/p>\n<div class=\"uzman-ipucu\">\n  Uzman \u0130pucu: <code>==<\/code> operat\u00f6r\u00fc, nesnelerin s\u0131n\u0131f isimlerini de kontrol eder. Farkl\u0131 s\u0131n\u0131flar\u0131n iki nesnesi, ayn\u0131 \u00f6zelliklere ve de\u011ferlere sahip olsalar bile <code>==<\/code> operat\u00f6r\u00fc ile <code>false<\/code> d\u00f6necektir. Bu, s\u0131n\u0131f\u0131n kimli\u011finin de\u011fer e\u015fitli\u011finde de \u00f6nemli oldu\u011funu g\u00f6sterir.\n<\/div>\n<pre><code>\n<?php\nclass Urun {\n    public $id;\n    public $ad;\n    public $fiyat;\n\n    public function __construct($id, $ad, $fiyat) {\n        $this->id = $id;\n        $this->ad = $ad;\n        $this->fiyat = $fiyat;\n    }\n}\n\n$urun1 = new Urun(1, \"Laptop\", 12000);\n$urun2 = new Urun(1, \"Laptop\", 12000);\n$urun3 = new Urun(2, \"Mouse\", 250);\n\n\/\/ urun1 ve urun2 ayn\u0131 s\u0131n\u0131ftan ve ayn\u0131 \u00f6zellik de\u011ferlerine sahip\nif ($urun1 == $urun2) {\n    echo \"Urun1 ve Urun2 de\u011fer olarak E\u015e\u0130TT\u0130R.\n\"; \/\/ \u00c7\u0131kt\u0131: E\u015e\u0130TT\u0130R\n} else {\n    echo \"Urun1 ve Urun2 de\u011fer olarak E\u015e\u0130T DE\u011e\u0130LD\u0130R.\n\";\n}\n\n\/\/ urun1 ve urun3 farkl\u0131 \u00f6zellik de\u011ferlerine sahip\nif ($urun1 == $urun3) {\n    echo \"Urun1 ve Urun3 de\u011fer olarak E\u015e\u0130TT\u0130R.\n\";\n} else {\n    echo \"Urun1 ve Urun3 de\u011fer olarak E\u015e\u0130T DE\u011e\u0130LD\u0130R.\n\"; \/\/ \u00c7\u0131kt\u0131: E\u015e\u0130T DE\u011e\u0130LD\u0130R\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>urun1<\/code> ve <code>urun2<\/code> nesneleri, bellekte farkl\u0131 yerlerde olmalar\u0131na ra\u011fmen ayn\u0131 s\u0131n\u0131f\u0131n \u00f6rnekleri ve ayn\u0131 \u00f6zellik de\u011ferlerine sahip olduklar\u0131 i\u00e7in <code>==<\/code> ile kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131klar\u0131nda <code>true<\/code> d\u00f6nerler. Ancak <code>urun3<\/code> farkl\u0131 bir \u00fcr\u00fcn\u00fc temsil etti\u011fi i\u00e7in <code>urun1<\/code> ile <code>==<\/code> kar\u015f\u0131la\u015ft\u0131rmas\u0131nda <code>false<\/code> d\u00f6ner.<\/p>\n<h3><code>===<\/code> Operat\u00f6r\u00fc: Referans Kar\u015f\u0131la\u015ft\u0131rmas\u0131 ve Kapsaml\u0131 E\u015fitlik<\/h3>\n<p>PHP'de <code>===<\/code> (kesin e\u015fitlik) operat\u00f6r\u00fc, nesneleri kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in kullan\u0131ld\u0131\u011f\u0131nda, <code>==<\/code> operat\u00f6r\u00fcnden \u00e7ok daha kat\u0131 bir kontrol yapar. Bu operat\u00f6r, \"referans kar\u015f\u0131la\u015ft\u0131rmas\u0131\" olarak bilinir. Yani, iki de\u011fi\u015fkenin *ayn\u0131 nesnenin ayn\u0131 \u00f6rne\u011fine mi referans etti\u011fini* kontrol eder. Ba\u015fka bir deyi\u015fle, bellekteki ayn\u0131 adresi i\u015faret edip etmediklerine bakar. E\u011fer iki de\u011fi\u015fken ayn\u0131 nesne \u00f6rne\u011fine referans ediyorsa, <code>===<\/code> operat\u00f6r\u00fc <code>true<\/code> d\u00f6nd\u00fcr\u00fcr; aksi takdirde <code>false<\/code> d\u00f6ner.<\/p>\n<p>Bu, \u00f6zellikle bir nesnenin tekil bir \u00f6rnek olmas\u0131n\u0131n garanti edilmesi gereken durumlarda veya nesne kimli\u011finin mutlak \u00f6nem ta\u015f\u0131d\u0131\u011f\u0131 senaryolarda hayati bir \u00f6neme sahiptir. \u00d6rne\u011fin, bir \"Singleton\" tasar\u0131m deseni uygulad\u0131\u011f\u0131n\u0131zda, sisteminizde her zaman belirli bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011fi olmas\u0131n\u0131 istersiniz. Bu durumda, yeni bir nesne iste\u011fi geldi\u011finde mevcut \u00f6rne\u011fi mi d\u00f6nd\u00fcreceksiniz yoksa yeni bir tane mi olu\u015fturacaks\u0131n\u0131z? Mevcut \u00f6rnekle <code>===<\/code> kullanarak yeni olu\u015fturulan \u00f6rnekleri kar\u015f\u0131la\u015ft\u0131rarak bu durumu kolayca kontrol edebilirsiniz. Ayn\u0131 \u015fekilde, bir olay dinleyici listesinde belirli bir nesnenin zaten eklenip eklenmedi\u011fini kontrol ederken de <code>===<\/code> operat\u00f6r\u00fc devreye girer. \u00c7\u00fcnk\u00fc ayn\u0131 i\u00e7eri\u011fe sahip ba\u015fka bir nesne \u00f6rne\u011finin de\u011fil, tam olarak ayn\u0131 nesnenin eklenip eklenmedi\u011fini bilmek istersiniz.<\/p>\n<pre><code>\n<?php\nclass Kullanici {\n    public $id;\n    public $ad;\n\n    public function __construct($id, $ad) {\n        $this->id = $id;\n        $this->ad = $ad;\n    }\n}\n\n$kullaniciA = new Kullanici(1, \"Ay\u015fe\");\n$kullaniciB = new Kullanici(1, \"Ay\u015fe\"); \/\/ Yeni bir nesne \u00f6rne\u011fi\n$kullaniciC = $kullaniciA;            \/\/ KullaniciA'ya referans ediyor\n\n\/\/ kullaniciA ve kullaniciB farkl\u0131 nesne \u00f6rnekleri, ancak de\u011ferleri ayn\u0131\nif ($kullaniciA === $kullaniciB) {\n    echo \"KullaniciA ve KullaniciB REFERANS olarak E\u015e\u0130TT\u0130R.\n\";\n} else {\n    echo \"KullaniciA ve KullaniciB REFERANS olarak E\u015e\u0130T DE\u011e\u0130LD\u0130R.\n\"; \/\/ \u00c7\u0131kt\u0131: E\u015e\u0130T DE\u011e\u0130LD\u0130R\n}\n\n\/\/ kullaniciA ve kullaniciC ayn\u0131 nesne \u00f6rne\u011fini referans ediyor\nif ($kullaniciA === $kullaniciC) {\n    echo \"KullaniciA ve KullaniciC REFERANS olarak E\u015e\u0130TT\u0130R.\n\"; \/\/ \u00c7\u0131kt\u0131: E\u015e\u0130TT\u0130R\n} else {\n    echo \"KullaniciA ve KullaniciC REFERANS olarak E\u015e\u0130T DE\u011e\u0130LD\u0130R.\n\";\n}\n\necho \"--- De\u011fer Kar\u015f\u0131la\u015ft\u0131rmas\u0131 (==) ile Fark\u0131 ---\n\";\nif ($kullaniciA == $kullaniciB) {\n    echo \"KullaniciA ve KullaniciB DE\u011eER olarak E\u015e\u0130TT\u0130R.\n\"; \/\/ \u00c7\u0131kt\u0131: E\u015e\u0130TT\u0130R\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte de g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>$kullaniciA<\/code> ve <code>$kullaniciB<\/code> ayn\u0131 i\u00e7eri\u011fe sahip olsalar bile, <code>===<\/code> ile kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131klar\u0131nda <code>false<\/code> d\u00f6nerler \u00e7\u00fcnk\u00fc bellekte farkl\u0131 konumlarda yer alan iki ayr\u0131 nesne \u00f6rne\u011fidirler. Ancak <code>$kullaniciA<\/code> ve <code>$kullaniciC<\/code>, <code>$kullaniciA<\/code>'n\u0131n referans\u0131n\u0131 <code>$kullaniciC<\/code>'ye atad\u0131\u011f\u0131m\u0131z i\u00e7in ayn\u0131 nesneyi i\u015faret ederler ve bu nedenle <code>===<\/code> ile kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131klar\u0131nda <code>true<\/code> d\u00f6nerler. <code>==<\/code> operat\u00f6r\u00fc ise <code>$kullaniciA<\/code> ve <code>$kullaniciB<\/code> i\u00e7in <code>true<\/code> d\u00f6nd\u00fcr\u00fcr, \u00e7\u00fcnk\u00fc i\u00e7erikleri ayn\u0131d\u0131r. Bu, her iki operat\u00f6r\u00fcn kullan\u0131m amac\u0131n\u0131 ve farkl\u0131l\u0131klar\u0131n\u0131 net bir \u015fekilde ortaya koyar.<\/p>\n<h3>Vaka Analizi: Basit Bir Kullan\u0131c\u0131 S\u0131n\u0131f\u0131 \u00dczerinden Farklar\u0131 Ke\u015ffetme<\/h3>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu operat\u00f6rlerin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 daha iyi anlamak i\u00e7in bir vaka analizi yapal\u0131m. Bir e-ticaret uygulamas\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z\u0131 varsayal\u0131m. Kullan\u0131c\u0131lar\u0131 temsil eden bir <code>User<\/code> s\u0131n\u0131f\u0131m\u0131z var ve bu kullan\u0131c\u0131lar\u0131 farkl\u0131 senaryolarda kar\u015f\u0131la\u015ft\u0131rmam\u0131z gerekiyor. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131yla ayn\u0131 olup olmad\u0131\u011f\u0131n\u0131 veya bir sipari\u015fin belirli bir kullan\u0131c\u0131ya ait olup olmad\u0131\u011f\u0131n\u0131 kontrol etmemiz gerekebilir. \u0130\u015fte bu noktada <code>==<\/code> ve <code>===<\/code> operat\u00f6rlerinin do\u011fru kullan\u0131m\u0131 kritik hale gelir.<\/p>\n<p>\u00d6ncelikle, <code>User<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131 tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\n<?php\nclass User {\n    public $id;\n    public $name;\n    public $email;\n\n    public function __construct($id, $name, $email) {\n        $this->id = $id;\n        $this->name = $name;\n        $this->email = $email;\n    }\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi birka\u00e7 <code>User<\/code> nesnesi olu\u015ftural\u0131m ve bunlar\u0131 farkl\u0131 \u015fekillerde kar\u015f\u0131la\u015ft\u0131ral\u0131m:<\/p>\n<pre><code>\n<?php\n\/\/ Senaryo 1: Ayn\u0131 veritaban\u0131 kayd\u0131ndan gelen iki kullan\u0131c\u0131 (varsay\u0131msal)\n$loggedInUser = new User(101, \"Ali Can\", \"ali.can@example.com\");\n$userFromOrder = new User(101, \"Ali Can\", \"ali.can@example.com\");\n\n\/\/ Senaryo 2: Oturum a\u00e7an kullan\u0131c\u0131y\u0131 ba\u015fka bir de\u011fi\u015fkene atama\n$currentUserSession = $loggedInUser;\n\n\/\/ Senaryo 3: Farkl\u0131 bir kullan\u0131c\u0131\n$anotherUser = new User(102, \"Ay\u015fe Demir\", \"ayse.demir@example.com\");\n\necho \"<h3>Operat\u00f6r Kar\u015f\u0131la\u015ft\u0131rmalar\u0131:<\/h3>\";\n\n\/\/ 1. loggedInUser ve userFromOrder i\u00e7in == kar\u015f\u0131la\u015ft\u0131rmas\u0131\necho \"<h4>\\$loggedInUser == \\$userFromOrder<\/h4>\";\nif ($loggedInUser == $userFromOrder) {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T: Her iki nesne de ayn\u0131 s\u0131n\u0131ftan ve ayn\u0131 \u00f6zellik de\u011ferlerine sahip.<\/p>\";\n} else {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\n\/\/ 2. loggedInUser ve userFromOrder i\u00e7in === kar\u015f\u0131la\u015ft\u0131rmas\u0131\necho \"<h4>\\$loggedInUser === \\$userFromOrder<\/h4>\";\nif ($loggedInUser === $userFromOrder) {\n    echo \"<p>Referans olarak E\u015e\u0130T: Ayn\u0131 nesne \u00f6rne\u011fini i\u015faret ediyorlar.<\/p>\";\n} else {\n    echo \"<p>Referans olarak E\u015e\u0130T DE\u011e\u0130L: Farkl\u0131 nesne \u00f6rnekleri olsalar da i\u00e7erikleri ayn\u0131.<\/p>\";\n}\n\n\/\/ 3. loggedInUser ve currentUserSession i\u00e7in === kar\u015f\u0131la\u015ft\u0131rmas\u0131\necho \"<h4>\\$loggedInUser === \\$currentUserSession<\/h4>\";\nif ($loggedInUser === $currentUserSession) {\n    echo \"<p>Referans olarak E\u015e\u0130T: Ayn\u0131 nesne \u00f6rne\u011fini i\u015faret ediyorlar \u00e7\u00fcnk\u00fc \\$currentUserSession, \\$loggedInUser'\u0131n referans\u0131n\u0131 ald\u0131.<\/p>\";\n} else {\n    echo \"<p>Referans olarak E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\n\/\/ 4. loggedInUser ve anotherUser i\u00e7in == kar\u015f\u0131la\u015ft\u0131rmas\u0131\necho \"<h4>\\$loggedInUser == \\$anotherUser<\/h4>\";\nif ($loggedInUser == $anotherUser) {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T DE\u011e\u0130L: \u00d6zellik de\u011ferleri farkl\u0131.<\/p>\";\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizinde, <code>$loggedInUser<\/code> ve <code>$userFromOrder<\/code>, veritaban\u0131ndan ayn\u0131 kullan\u0131c\u0131 ID'si ile gelmi\u015f olsalar bile (\u00f6rne\u011fin iki ayr\u0131 sorguyla), bellekte iki farkl\u0131 nesne \u00f6rne\u011fi olduklar\u0131 i\u00e7in <code>===<\/code> ile kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131klar\u0131nda <code>false<\/code> d\u00f6nerler. Ancak i\u00e7erikleri ayn\u0131 oldu\u011fu i\u00e7in <code>==<\/code> ile <code>true<\/code> d\u00f6nerler. Di\u011fer taraftan, <code>$loggedInUser<\/code> ve <code>$currentUserSession<\/code> ayn\u0131 nesneyi i\u015faret etti\u011fi i\u00e7in hem <code>==<\/code> hem de <code>===<\/code> ile kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131klar\u0131nda <code>true<\/code> d\u00f6nerler. Bu \u00f6rnek, hangi operat\u00f6r\u00fcn ne zaman kullan\u0131laca\u011f\u0131na dair net bir perspektif sunar.<\/p>\n<h2>Nesne Kar\u015f\u0131la\u015ft\u0131rmas\u0131nda Derinlemesine Uygulamalar: Ad\u0131m Ad\u0131m K\u0131lavuz<\/h2>\n<p>Nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131 sadece <code>==<\/code> ve <code>===<\/code> operat\u00f6rleriyle s\u0131n\u0131rl\u0131 de\u011fildir. \u00d6zellikle daha karma\u015f\u0131k nesne yap\u0131lar\u0131na veya \u00f6zel kar\u015f\u0131la\u015ft\u0131rma mant\u0131klar\u0131na ihtiya\u00e7 duydu\u011funuzda, PHP'nin sundu\u011fu geli\u015fmi\u015f \u00f6zellikleri kullanman\u0131z gerekir. Bu b\u00f6l\u00fcm, nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131n\u0131 bir ad\u0131m \u00f6teye ta\u015f\u0131yacak, <code>__clone()<\/code> metodu, \u00f6zel kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131 olu\u015fturma ve karma\u015f\u0131k nesneleri ele alma gibi konulara odaklanacakt\u0131r. B\u00f6ylece, uygulaman\u0131z\u0131n gerektirdi\u011fi her t\u00fcrl\u00fc kar\u015f\u0131la\u015ft\u0131rma senaryosuna esnek ve verimli \u00e7\u00f6z\u00fcmler \u00fcretebileceksiniz.<\/p>\n<h3>Nesne \u00d6zelliklerini Kar\u015f\u0131la\u015ft\u0131rma ve <code>__clone()<\/code> Metodu<\/h3>\n<p>Bazen nesneleri kar\u015f\u0131la\u015ft\u0131r\u0131rken sadece y\u00fczeydeki \u00f6zelliklerin ayn\u0131 olup olmad\u0131\u011f\u0131na bakmak yeterli olmaz. Nesneler, genellikle di\u011fer nesneleri veya kaynaklar\u0131 da i\u00e7erebilir. Bu durumda, <code>==<\/code> operat\u00f6r\u00fc, i\u00e7 i\u00e7e ge\u00e7mi\u015f nesneler i\u00e7in varsay\u0131lan olarak yine kendi de\u011fer kar\u015f\u0131la\u015ft\u0131rma prensibini uygulayacakt\u0131r. Ancak, bu her zaman beklenen davran\u0131\u015f\u0131 vermeyebilir, \u00f6zellikle de referanslar \u00fczerinde hassasiyet gerekti\u011finde.<\/p>\n<p><code>__clone()<\/code> sihirli metodu, bir nesnenin kopyas\u0131 olu\u015fturuldu\u011funda tetiklenen \u00f6zel bir metottur. PHP'de bir nesneyi kopyalamak i\u00e7in <code>clone<\/code> anahtar kelimesi kullan\u0131l\u0131r. Varsay\u0131lan olarak, <code>clone $nesne<\/code> i\u015flemi s\u0131\u011f bir kopyalama (shallow copy) yapar; yani, orijinal nesnenin t\u00fcm \u00f6zelliklerini yeni nesneye kopyalar. Ancak, e\u011fer orijinal nesnenin \u00f6zellikleri aras\u0131nda ba\u015fka nesnelere referanslar varsa, bu referanslar kopyalanan nesnede de ayn\u0131 orijinal nesneleri i\u015faret etmeye devam eder. Derinlemesine bir kopyalama (deep copy) yapmak istedi\u011finizde, yani i\u00e7 i\u00e7e ge\u00e7mi\u015f nesnelerin de kendi ba\u011f\u0131ms\u0131z kopyalar\u0131n\u0131n olu\u015fturulmas\u0131n\u0131 istedi\u011finizde <code>__clone()<\/code> metodunu kullanman\u0131z gerekir.<\/p>\n<pre><code>\n<?php\nclass Adres {\n    public $sokak;\n    public $sehir;\n\n    public function __construct($sokak, $sehir) {\n        $this->sokak = $sokak;\n        $this->sehir = $sehir;\n    }\n\n    \/\/ __clone() metodu derinlemesine kopya i\u00e7in\n    public function __clone() {\n        \/\/ Adres nesnesinin kendisi ilkel tipler i\u00e7erdi\u011fi i\u00e7in burada \u00f6zel bir i\u015flem gerekmez.\n        \/\/ Ancak i\u00e7inde ba\u015fka nesneler olsayd\u0131, onlar\u0131n da clone edilmesi gerekirdi.\n        \/\/ \u00d6rne\u011fin: $this->baskaNesne = clone $this->baskaNesne;\n    }\n}\n\nclass Musteri {\n    public $id;\n    public $ad;\n    public Adres $adres; \/\/ Adres nesnesini i\u00e7eriyor\n\n    public function __construct($id, $ad, Adres $adres) {\n        $this->id = $id;\n        $this->ad = $ad;\n        $this->adres = $adres;\n    }\n\n    public function __clone() {\n        \/\/ Musteri nesnesi kopyaland\u0131\u011f\u0131nda, i\u00e7indeki Adres nesnesinin de kopyalanmas\u0131n\u0131 sa\u011flar\u0131z.\n        $this->adres = clone $this->adres;\n    }\n}\n\n$adres1 = new Adres(\"Ana Cadde 10\", \"\u0130stanbul\");\n$musteri1 = new Musteri(1, \"Deniz\", $adres1);\n\n\/\/ Musteri1'i kopyala\n$musteri2 = clone $musteri1;\n\n\/\/ muster1 ve musteri2'nin de\u011ferlerini kar\u015f\u0131la\u015ft\u0131r\necho \"<h3>M\u00fc\u015fteri Nesnelerinin Kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131:<\/h3>\";\necho \"<h4>\\$musteri1 == \\$musteri2<\/h4>\";\nif ($musteri1 == $musteri2) {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T: \u00d6zellikler ve i\u00e7indeki Adres nesneleri de\u011fer olarak ayn\u0131.<\/p>\";\n} else {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\necho \"<h4>\\$musteri1 === \\$musteri2<\/h4>\";\nif ($musteri1 === $musteri2) {\n    echo \"<p>Referans olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Referans olarak E\u015e\u0130T DE\u011e\u0130L: \u0130ki farkl\u0131 nesne \u00f6rne\u011fi.<\/p>\";\n}\n\n\/\/ Adres nesnelerinin referans\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r (derin kopya sayesinde farkl\u0131 olmal\u0131lar)\necho \"<h4>\\$musteri1->adres === \\$musteri2->adres<\/h4>\";\nif ($musteri1->adres === $musteri2->adres) {\n    echo \"<p>M\u00fc\u015fteri adresleri referans olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>M\u00fc\u015fteri adresleri referans olarak E\u015e\u0130T DE\u011e\u0130L: Musteri'nin __clone() metodu sayesinde Adres de kopyaland\u0131.<\/p>\";\n}\n\n\/\/ Bir \u00f6zelli\u011fini de\u011fi\u015ftir ve tekrar kar\u015f\u0131la\u015ft\u0131r\n$musteri1->ad = \"Deniz Can\";\necho \"<h4>\\$musteri1 == \\$musteri2 (isim de\u011fi\u015fikli\u011fi sonras\u0131)<\/h4>\";\nif ($musteri1 == $musteri2) {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T DE\u011e\u0130L: \u0130sim \u00f6zelli\u011fi farkl\u0131la\u015ft\u0131.<\/p>\";\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>Musteri<\/code> s\u0131n\u0131f\u0131n\u0131n <code>__clone()<\/code> metodunda <code>adres<\/code> \u00f6zelli\u011fini de kopyalayarak derin bir kopyalama sa\u011fl\u0131yoruz. B\u00f6ylece <code>musteri1<\/code> ve <code>musteri2<\/code> farkl\u0131 nesneler olsa da, i\u00e7erdikleri <code>Adres<\/code> nesneleri de ayr\u0131 kopyalar oluyor. Bu, \u00f6zellikle bir nesnenin ba\u011f\u0131ms\u0131z bir kopyas\u0131 \u00fczerinde i\u015flem yapmak istedi\u011finizde ve orijinal nesnenin etkilenmemesini sa\u011flamak istedi\u011finizde kritik bir yakla\u015f\u0131md\u0131r. E\u011fer <code>__clone()<\/code> metodunu <code>Musteri<\/code> s\u0131n\u0131f\u0131nda tan\u0131mlamazsak, <code>musteri1<\/code> ve <code>musteri2<\/code>'nin <code>adres<\/code> \u00f6zellikleri ayn\u0131 <code>Adres<\/code> nesnesine referans etmeye devam ederdi, bu da s\u0131\u011f kopyalaman\u0131n bir sonucudur.<\/p>\n<h3>\u00d6zel Kar\u015f\u0131la\u015ft\u0131rma Mant\u0131\u011f\u0131 Olu\u015fturma: <code>__equals()<\/code> Gibi Yakla\u015f\u0131mlar<\/h3>\n<p>PHP'nin yerle\u015fik <code>==<\/code> ve <code>===<\/code> operat\u00f6rleri \u00e7o\u011fu zaman yeterli olsa da, bazen nesnelerinizi kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in daha karma\u015f\u0131k veya \u00f6zelle\u015ftirilmi\u015f bir mant\u0131\u011fa ihtiyac\u0131n\u0131z olabilir. \u00d6rne\u011fin, belirli bir nesnenin sadece baz\u0131 \u00f6zelliklerinin ayn\u0131 olmas\u0131n\u0131 isteyebilir veya i\u00e7 i\u00e7e ge\u00e7mi\u015f nesneler i\u00e7in farkl\u0131 kar\u015f\u0131la\u015ft\u0131rma kurallar\u0131 uygulaman\u0131z gerekebilir. PHP'de do\u011frudan bir <code>__equals()<\/code> sihirli metodu bulunmamaktad\u0131r (Java'daki gibi), ancak bu i\u015flevselli\u011fi kendi s\u0131n\u0131flar\u0131n\u0131zda kolayca taklit edebilirsiniz.<\/p>\n<p>Bunu yapman\u0131n en yayg\u0131n yolu, s\u0131n\u0131f\u0131n\u0131z\u0131n i\u00e7ine <code>equals()<\/code> veya <code>isEqualTo()<\/code> gibi \u00f6zel bir metot tan\u0131mlamakt\u0131r. Bu metot, kendisine parametre olarak ba\u015fka bir nesne al\u0131r ve bu iki nesnenin sizin belirledi\u011finiz kriterlere g\u00f6re e\u015fit olup olmad\u0131\u011f\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr. Bu yakla\u015f\u0131m, kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131n\u0131z \u00fczerinde tam kontrol sa\u011flar ve i\u015f gereksinimlerinize \u00f6zel esneklik sunar.<\/p>\n<pre><code>\n<?php\nclass SiparisUrunu {\n    public $urunId;\n    public $adet;\n    public $birimFiyat;\n\n    public function __construct($urunId, $adet, $birimFiyat) {\n        $this->urunId = $urunId;\n        $this->adet = $adet;\n        $this->birimFiyat = $birimFiyat;\n    }\n\n    \/\/ \u00d6zel kar\u015f\u0131la\u015ft\u0131rma metodu\n    public function equals(SiparisUrunu $other): bool {\n        \/\/ Sadece urunId'nin ayn\u0131 olmas\u0131n\u0131 yeterli g\u00f6rebiliriz\n        \/\/ Veya adet ve birimFiyat'\u0131n da ayn\u0131 olmas\u0131n\u0131 isteyebiliriz.\n        \/\/ Bu \u00f6rnekte, ayn\u0131 ID'ye sahip \u00fcr\u00fcnleri e\u015fit sayaca\u011f\u0131z.\n        return $this->urunId === $other->urunId;\n    }\n}\n\n$siparisUrun1 = new SiparisUrunu(101, 2, 50.0);\n$siparisUrun2 = new SiparisUrunu(101, 1, 50.0); \/\/ Adet farkl\u0131, ID ayn\u0131\n$siparisUrun3 = new SiparisUrunu(102, 2, 75.0); \/\/ ID farkl\u0131\n\necho \"<h3>\u00d6zel Kar\u015f\u0131la\u015ft\u0131rma (equals) Metodu:<\/h3>\";\n\n\/\/ SiparisUrun1 ve SiparisUrun2'yi equals metodu ile kar\u015f\u0131la\u015ft\u0131r\necho \"<h4>\\$siparisUrun1->equals(\\$siparisUrun2)<\/h4>\";\nif ($siparisUrun1->equals($siparisUrun2)) {\n    echo \"<p>ID olarak E\u015e\u0130T: Her iki \u00fcr\u00fcn de ayn\u0131 ID'ye sahip.<\/p>\";\n} else {\n    echo \"<p>ID olarak E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\n\/\/ PHP'nin varsay\u0131lan == operat\u00f6r\u00fc ile kar\u015f\u0131la\u015ft\u0131rma (adet farkl\u0131 oldu\u011fu i\u00e7in false d\u00f6ner)\necho \"<h4>\\$siparisUrun1 == \\$siparisUrun2 (varsay\u0131lan ==)<\/h4>\";\nif ($siparisUrun1 == $siparisUrun2) {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>De\u011fer olarak E\u015e\u0130T DE\u011e\u0130L: Adet \u00f6zelli\u011fi farkl\u0131 oldu\u011fu i\u00e7in.<\/p>\";\n}\n\n\/\/ Farkl\u0131 ID'ye sahip \u00fcr\u00fcnleri kar\u015f\u0131la\u015ft\u0131r\necho \"<h4>\\$siparisUrun1->equals(\\$siparisUrun3)<\/h4>\";\nif ($siparisUrun1->equals($siparisUrun3)) {\n    echo \"<p>ID olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>ID olarak E\u015e\u0130T DE\u011e\u0130L: \u00dcr\u00fcn ID'leri farkl\u0131.<\/p>\";\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>SiparisUrunu<\/code> s\u0131n\u0131f\u0131, <code>equals()<\/code> ad\u0131nda \u00f6zel bir metot tan\u0131ml\u0131yor. Bu metot, sadece <code>urunId<\/code> \u00f6zelli\u011finin ayn\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol ederek iki <code>SiparisUrunu<\/code> nesnesinin e\u015fitli\u011fini belirliyor. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>equals()<\/code> metodu <code>true<\/code> d\u00f6nerken, PHP'nin varsay\u0131lan <code>==<\/code> operat\u00f6r\u00fc (adet farkl\u0131 oldu\u011fu i\u00e7in) <code>false<\/code> d\u00f6nd\u00fcr\u00fcyor. Bu da \u00f6zel kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131n\u0131n ne kadar g\u00fc\u00e7l\u00fc ve esnek olabilece\u011fini g\u00f6stermektedir. Bu y\u00f6ntem, i\u015f mant\u0131\u011f\u0131n\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na g\u00f6re farkl\u0131 \u00f6zellik kombinasyonlar\u0131n\u0131, hatta i\u00e7 i\u00e7e ge\u00e7mi\u015f nesnelerin kendi <code>equals()<\/code> metotlar\u0131n\u0131 \u00e7a\u011f\u0131rarak derinlemesine kar\u015f\u0131la\u015ft\u0131rmalar yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Karma\u015f\u0131k Nesneler ve \u0130\u00e7 \u0130\u00e7e Yap\u0131lar Nas\u0131l Kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r?<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda nesneler genellikle basit veri tiplerini de\u011fil, ba\u015fka nesneleri veya nesne koleksiyonlar\u0131n\u0131 da i\u00e7erir. Bu t\u00fcr karma\u015f\u0131k, i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lara sahip nesneleri kar\u015f\u0131la\u015ft\u0131rmak, daha fazla dikkat ve \u00f6zel yakla\u015f\u0131mlar gerektirir. PHP'nin varsay\u0131lan <code>==<\/code> operat\u00f6r\u00fc, i\u00e7 i\u00e7e nesneler i\u00e7in de de\u011fer kar\u015f\u0131la\u015ft\u0131rmas\u0131 yapar, yani e\u011fer i\u00e7 nesneler ayn\u0131 s\u0131n\u0131ftan ve ayn\u0131 \u00f6zellik de\u011ferlerine sahipse e\u015fit kabul eder. Ancak bu, her zaman yeterli olmayabilir.<\/p>\n<p>\u00d6rne\u011fin, bir <code>Siparis<\/code> nesnesi d\u00fc\u015f\u00fcn\u00fcn. Bu nesne bir <code>Musteri<\/code> nesnesi, bir <code>Adres<\/code> nesnesi ve <code>SiparisUrunu<\/code> nesnelerinden olu\u015fan bir dizi (collection) i\u00e7erebilir. Bu <code>Siparis<\/code> nesnelerinin e\u015fitli\u011fini kontrol etmek istedi\u011finizde, sadece sipari\u015fin kendi ID'sine bakmak yeterli olmayabilir; m\u00fc\u015fteri, adres ve t\u00fcm sipari\u015f \u00fcr\u00fcnlerinin de belirli kriterlere g\u00f6re e\u015fit olmas\u0131 gerekebilir.<\/p>\n<pre><code>\n<?php\n\/\/ \u00d6nceki \u00f6rneklerden Adres, Musteri ve SiparisUrunu s\u0131n\u0131flar\u0131n\u0131 kulland\u0131\u011f\u0131m\u0131z\u0131 varsayal\u0131m.\n\/\/ Tekrar tan\u0131mlama gere\u011fi duymadan sadece \u00e7a\u011f\u0131raca\u011f\u0131z.\n\n\/\/ Adres s\u0131n\u0131f\u0131 (yukar\u0131da tan\u0131mland\u0131)\n\/\/ Musteri s\u0131n\u0131f\u0131 (yukar\u0131da tan\u0131mland\u0131)\n\/\/ SiparisUrunu s\u0131n\u0131f\u0131 (yukar\u0131da tan\u0131mland\u0131, \u00f6zel equals metodu ile)\n\nclass Siparis {\n    public $siparisNo;\n    public Musteri $musteri;\n    public Adres $teslimatAdresi;\n    public array $urunler = []; \/\/ SiparisUrunu nesneleri i\u00e7erecek\n\n    public function __construct($siparisNo, Musteri $musteri, Adres $teslimatAdresi) {\n        $this->siparisNo = $siparisNo;\n        $this->musteri = $musteri;\n        $this->teslimatAdresi = $teslimatAdresi;\n    }\n\n    public function addUrun(SiparisUrunu $urun) {\n        $this->urunler[] = $urun;\n    }\n\n    \/\/ Sipari\u015f nesneleri i\u00e7in \u00f6zel kar\u015f\u0131la\u015ft\u0131rma metodu\n    public function equals(Siparis $other): bool {\n        \/\/ \u00d6nce sipari\u015f numaralar\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\n        if ($this->siparisNo !== $other->siparisNo) {\n            return false;\n        }\n\n        \/\/ M\u00fc\u015fterileri \u00f6zel equals metodu ile kar\u015f\u0131la\u015ft\u0131r (veya == ile)\n        \/\/ Burada == kullanabiliriz \u00e7\u00fcnk\u00fc Musteri s\u0131n\u0131f\u0131nda \u00f6zel equals yok.\n        if (!($this->musteri == $other->musteri)) {\n             return false;\n        }\n\n        \/\/ Teslimat adreslerini kar\u015f\u0131la\u015ft\u0131r\n        if (!($this->teslimatAdresi == $other->teslimatAdresi)) {\n            return false;\n        }\n\n        \/\/ \u00dcr\u00fcn listelerinin boyutunu kar\u015f\u0131la\u015ft\u0131r\n        if (count($this->urunler) !== count($other->urunler)) {\n            return false;\n        }\n\n        \/\/ Her bir \u00fcr\u00fcn\u00fc tek tek kar\u015f\u0131la\u015ft\u0131r (SiparisUrunu'nun kendi equals metodunu kullan)\n        foreach ($this->urunler as $index => $urun) {\n            if (!$urun->equals($other->urunler[$index])) {\n                return false;\n            }\n        }\n\n        return true; \/\/ T\u00fcm ko\u015fullar sa\u011fland\u0131ysa e\u015fit\n    }\n}\n\n\/\/ \u00d6rnek nesneler olu\u015ftural\u0131m\n$adresA = new Adres(\"Ana Cadde 10\", \"\u0130stanbul\");\n$musteriA = new Musteri(1, \"Deniz\", $adresA);\n\n$siparisUrunX = new SiparisUrunu(101, 2, 50.0);\n$siparisUrunY = new SiparisUrunu(102, 1, 75.0);\n\n$siparis1 = new Siparis(\"ORD-001\", $musteriA, $adresA);\n$siparis1->addUrun($siparisUrunX);\n$siparis1->addUrun($siparisUrunY);\n\n\/\/ Sipari\u015f 2: Sipari\u015f 1 ile ayn\u0131 verilere sahip, ancak farkl\u0131 nesne \u00f6rnekleri\n$adresB = new Adres(\"Ana Cadde 10\", \"\u0130stanbul\"); \/\/ Yeni adres nesnesi\n$musteriB = new Musteri(1, \"Deniz\", $adresB);    \/\/ Yeni m\u00fc\u015fteri nesnesi\n$siparisUrunX_kopya = new SiparisUrunu(101, 2, 50.0); \/\/ Yeni \u00fcr\u00fcn nesnesi\n$siparisUrunY_kopya = new SiparisUrunu(102, 1, 75.0); \/\/ Yeni \u00fcr\u00fcn nesnesi\n\n$siparis2 = new Siparis(\"ORD-001\", $musteriB, $adresB);\n$siparis2->addUrun($siparisUrunX_kopya);\n$siparis2->addUrun($siparisUrunY_kopya);\n\n\/\/ Sipari\u015f 3: Sadece sipari\u015f numaras\u0131 farkl\u0131\n$siparis3 = new Siparis(\"ORD-002\", $musteriA, $adresA);\n$siparis3->addUrun($siparisUrunX);\n$siparis3->addUrun($siparisUrunY);\n\necho \"<h3>Karma\u015f\u0131k Nesne Kar\u015f\u0131la\u015ft\u0131rmalar\u0131 (Sipari\u015f):<\/h3>\";\n\n\/\/ Siparis1 ve Siparis2'yi \u00f6zel equals metodu ile kar\u015f\u0131la\u015ft\u0131r\necho \"<h4>\\$siparis1->equals(\\$siparis2)<\/h4>\";\nif ($siparis1->equals($siparis2)) {\n    echo \"<p>\u00d6zel equals ile E\u015e\u0130T: T\u00fcm i\u00e7 nesneler ve de\u011ferler e\u015fle\u015fiyor.<\/p>\";\n} else {\n    echo \"<p>\u00d6zel equals ile E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\n\/\/ Siparis1 ve Siparis3'\u00fc \u00f6zel equals metodu ile kar\u015f\u0131la\u015ft\u0131r\necho \"<h4>\\$siparis1->equals(\\$siparis3)<\/h4>\";\nif ($siparis1->equals($siparis3)) {\n    echo \"<p>\u00d6zel equals ile E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>\u00d6zel equals ile E\u015e\u0130T DE\u011e\u0130L: Sipari\u015f numaralar\u0131 farkl\u0131.<\/p>\";\n}\n\n\/\/ PHP'nin varsay\u0131lan == operat\u00f6r\u00fc ile Siparis1 ve Siparis2'yi kar\u015f\u0131la\u015ft\u0131r\n\/\/ Bu da true d\u00f6necektir \u00e7\u00fcnk\u00fc t\u00fcm i\u00e7 i\u00e7e nesnelerin de de\u011ferleri ayn\u0131d\u0131r.\necho \"<h4>\\$siparis1 == \\$siparis2 (varsay\u0131lan ==)<\/h4>\";\nif ($siparis1 == $siparis2) {\n    echo \"<p>Varsay\u0131lan == ile E\u015e\u0130T: T\u00fcm i\u00e7 nesnelerin de\u011ferleri ayn\u0131.<\/p>\";\n} else {\n    echo \"<p>Varsay\u0131lan == ile E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\n\/\/ PHP'nin varsay\u0131lan === operat\u00f6r\u00fc ile Siparis1 ve Siparis2'yi kar\u015f\u0131la\u015ft\u0131r\n\/\/ Bu false d\u00f6necektir \u00e7\u00fcnk\u00fc her biri ayr\u0131 nesne \u00f6rnekleridir.\necho \"<h4>\\$siparis1 === \\$siparis2 (varsay\u0131lan ===)<\/h4>\";\nif ($siparis1 === $siparis2) {\n    echo \"<p>Varsay\u0131lan === ile E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Varsay\u0131lan === ile E\u015e\u0130T DE\u011e\u0130L: Farkl\u0131 nesne \u00f6rnekleri.<\/p>\";\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>Siparis<\/code> s\u0131n\u0131f\u0131na <code>equals()<\/code> ad\u0131nda bir metot ekledik. Bu metot, <code>siparisNo<\/code>'dan ba\u015flayarak, <code>musteri<\/code> ve <code>teslimatAdresi<\/code> gibi i\u00e7 i\u00e7e ge\u00e7mi\u015f nesneleri ve hatta <code>urunler<\/code> dizisindeki her bir <code>SiparisUrunu<\/code> nesnesini kendi <code>equals()<\/code> metotlar\u0131n\u0131 kullanarak kar\u015f\u0131la\u015ft\u0131r\u0131yor. Bu yakla\u015f\u0131m, karma\u015f\u0131k nesne hiyerar\u015filerinde bile tam ve do\u011fru bir e\u015fitlik kontrol\u00fc sa\u011flaman\u0131n en g\u00fcvenilir yoludur. Varsay\u0131lan <code>==<\/code> operat\u00f6r\u00fc, i\u00e7 i\u00e7e nesnelerin de\u011fer e\u015fitli\u011fini kontrol etse de, \u00f6zel mant\u0131k gerektiren durumlar i\u00e7in kendi <code>equals<\/code> metodunuzu yazmak, esneklik ve kontrol a\u00e7\u0131s\u0131ndan \u00e7ok daha avantajl\u0131d\u0131r.<\/p>\n<h3>Performans \u0130pu\u00e7lar\u0131 ve B\u00fcy\u00fck Veri K\u00fcmelerinde Optimizasyon<\/h3>\n<p>Nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131, \u00f6zellikle b\u00fcy\u00fck veri k\u00fcmeleri veya yo\u011fun i\u015flem gerektiren uygulamalarda performans a\u00e7\u0131s\u0131ndan \u00f6nemli bir rol oynayabilir. Yanl\u0131\u015f veya verimsiz kar\u015f\u0131la\u015ft\u0131rma y\u00f6ntemleri, uygulaman\u0131z\u0131n yava\u015flamas\u0131na veya gereksiz kaynak t\u00fcketimine neden olabilir. Bu b\u00f6l\u00fcmde, performans odakl\u0131 ipu\u00e7lar\u0131 ve b\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131n\u0131 nas\u0131l optimize edebilece\u011finizi inceleyece\u011fiz.<\/p>\n<ul>\n<li><strong>Referans Kar\u015f\u0131la\u015ft\u0131rmas\u0131na \u00d6ncelik Verin (<code>===<\/code>):<\/strong> M\u00fcmk\u00fcn oldu\u011funca, e\u011fer bir nesnenin tam olarak ayn\u0131 \u00f6rnek olup olmad\u0131\u011f\u0131n\u0131 kontrol etmeniz yeterliyse, <code>===<\/code> operat\u00f6r\u00fcn\u00fc kullan\u0131n. Bu, PHP'nin en h\u0131zl\u0131 kar\u015f\u0131la\u015ft\u0131rma y\u00f6ntemidir \u00e7\u00fcnk\u00fc sadece bellek adreslerini kontrol eder, nesne \u00f6zelliklerini derinlemesine incelemez. \u00d6zellikle \u00f6nbelle\u011fe alma, olay dinleyicileri veya tekil (singleton) desen uygulamalar\u0131nda bu \u00e7ok etkilidir.<\/li>\n<li><strong><code>==<\/code> Operat\u00f6r\u00fcn\u00fcn Maliyetini Anlay\u0131n:<\/strong> <code>==<\/code> operat\u00f6r\u00fc, t\u00fcm \u00f6zelliklerin de\u011ferlerini kar\u015f\u0131la\u015ft\u0131rd\u0131\u011f\u0131 i\u00e7in, \u00f6zellikle \u00e7ok say\u0131da \u00f6zelli\u011fe sahip veya i\u00e7 i\u00e7e ge\u00e7mi\u015f nesnelerde daha maliyetli olabilir. \u00c7ok b\u00fcy\u00fck nesne yap\u0131lar\u0131n\u0131 tekrar tekrar <code>==<\/code> ile kar\u015f\u0131la\u015ft\u0131rmaktan ka\u00e7\u0131n\u0131n, e\u011fer ger\u00e7ekten bu kadar derinle\u011fe inmenize gerek yoksa.<\/li>\n<li><strong>\u00d6zel <code>equals()<\/code> Metodlar\u0131nda Erken \u00c7\u0131k\u0131\u015f Yap\u0131n:<\/strong> Kendi <code>equals()<\/code> metotlar\u0131n\u0131z\u0131 yazarken, farkl\u0131l\u0131klar\u0131 m\u00fcmk\u00fcn olan en erken a\u015famada tespit edip metottan \u00e7\u0131k\u0131n. \u00d6rne\u011fin, \u00f6nce benzersiz bir ID'yi, sonra di\u011fer basit \u00f6zellikleri kar\u015f\u0131la\u015ft\u0131r\u0131n. E\u011fer ID'ler farkl\u0131ysa, di\u011fer pahal\u0131 kar\u015f\u0131la\u015ft\u0131rmalara gerek kalmaz. Bu, \u00f6zellikle i\u00e7 i\u00e7e ge\u00e7mi\u015f koleksiyonlar\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131rken performans\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/li>\n<li><strong>Hashing veya Kimlik Alanlar\u0131 Kullan\u0131n:<\/strong> E\u011fer nesnelerinizin benzersiz bir kimli\u011fi (ID, UUID vb.) varsa, \u00f6ncelikle bu kimlikleri kar\u015f\u0131la\u015ft\u0131rarak h\u0131zl\u0131 bir \u00f6n kontrol yapabilirsiniz. E\u011fer kimlikler farkl\u0131ysa, nesneler kesinlikle e\u015fit de\u011fildir. Bu, \u00f6zellikle veritaban\u0131ndan gelen nesnelerde \u00e7ok yayg\u0131n bir optimizasyon tekni\u011fidir. Karma\u015f\u0131k nesneler i\u00e7in, t\u00fcm anahtar \u00f6zelliklerden bir hash de\u011feri olu\u015fturup bu hash de\u011ferlerini kar\u015f\u0131la\u015ft\u0131rmak da h\u0131zl\u0131 bir \u00f6n kontrol sa\u011flayabilir, ancak hash \u00e7arp\u0131\u015fmas\u0131 riskini g\u00f6z \u00f6n\u00fcnde bulundurmak gerekir.<\/li>\n<li><strong>Koleksiyon Kar\u015f\u0131la\u015ft\u0131rmalar\u0131n\u0131 Optimize Edin:<\/strong> Bir <code>array<\/code> veya <code>Collection<\/code> s\u0131n\u0131f\u0131 i\u00e7indeki nesneleri kar\u015f\u0131la\u015ft\u0131r\u0131rken, her eleman\u0131 tek tek d\u00f6ng\u00fcye al\u0131p kar\u015f\u0131la\u015ft\u0131rmak yerine, \u00f6ncelikle koleksiyonlar\u0131n boyutlar\u0131n\u0131 kontrol edin. Boyutlar farkl\u0131ysa, e\u015fit olmalar\u0131 imkans\u0131zd\u0131r. Ard\u0131ndan, daha verimli bir kar\u015f\u0131la\u015ft\u0131rma i\u00e7in s\u0131ralama (sort) veya hash tabanl\u0131 yakla\u015f\u0131mlar\u0131 de\u011ferlendirebilirsiniz.<\/li>\n<\/ul>\n<pre><code>\n<?php\nclass PerformanceUser {\n    public $id;\n    public $name;\n    public $email;\n    public $createdAt; \/\/ DateTime nesnesi olabilir\n\n    public function __construct($id, $name, $email, $createdAt) {\n        $this->id = $id;\n        $this->name = $name;\n        $this->email = $email;\n        $this->createdAt = $createdAt;\n    }\n\n    public function equals(PerformanceUser $other): bool {\n        \/\/ Erken \u00e7\u0131k\u0131\u015f stratejisi: \u00d6nce ID'yi kontrol et\n        if ($this->id !== $other->id) {\n            return false;\n        }\n\n        \/\/ Sonra di\u011fer \u00f6nemli \u00f6zellikleri kontrol et\n        if ($this->name !== $other->name || $this->email !== $other->email) {\n            return false;\n        }\n\n        \/\/ createdAt bir DateTime nesnesi oldu\u011fu i\u00e7in kendi kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131na ihtiya\u00e7 duyabilir\n        \/\/ DateTime nesneleri do\u011frudan === ile kar\u015f\u0131la\u015ft\u0131r\u0131lamaz, \u00e7\u00fcnk\u00fc farkl\u0131 \u00f6rnekler olabilirler.\n        \/\/ Formatlay\u0131p string olarak kar\u015f\u0131la\u015ft\u0131rmak daha g\u00fcvenli olabilir.\n        if ($this->createdAt->format('Y-m-d H:i:s') !== $other->createdAt->format('Y-m-d H:i:s')) {\n            return false;\n        }\n\n        return true;\n    }\n}\n\n\/\/ \u00d6rnek kullan\u0131m\n$user1 = new PerformanceUser(1, \"Can\", \"can@example.com\", new DateTime());\n$user2 = new PerformanceUser(1, \"Can\", \"can@example.com\", new DateTime()); \/\/ Farkl\u0131 DateTime \u00f6rne\u011fi\n\necho \"<h3>Performans Odakl\u0131 Kar\u015f\u0131la\u015ft\u0131rma:<\/h3>\";\necho \"<h4>\\$user1->equals(\\$user2)<\/h4>\";\nif ($user1->equals($user2)) {\n    echo \"<p>Kullan\u0131c\u0131lar \u00f6zel equals metodu ile E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Kullan\u0131c\u0131lar \u00f6zel equals metodu ile E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\n\/\/ E\u011fer DateTime nesnesini === ile kar\u015f\u0131la\u015ft\u0131rsayd\u0131k, muhtemelen false d\u00f6nerdi\n\/\/ \u00e7\u00fcnk\u00fc farkl\u0131 DateTime nesneleri olsalar bile ayn\u0131 zaman\u0131 temsil edebilirler.\n\/\/ \u00d6zel equals metodu, bu t\u00fcr detaylar\u0131 y\u00f6netmemizi sa\u011flar.\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>equals()<\/code> metodu, \u00f6nce ID'leri kontrol ederek h\u0131zl\u0131 bir \u00e7\u0131k\u0131\u015f yapar. E\u011fer ID'ler farkl\u0131ysa, di\u011fer pahal\u0131 kar\u015f\u0131la\u015ft\u0131rmalara gerek kalmaz. Ayr\u0131ca, <code>DateTime<\/code> gibi nesneleri kar\u015f\u0131la\u015ft\u0131r\u0131rken do\u011frudan <code>===<\/code> kullanmak yerine, onlar\u0131n de\u011ferlerini (\u00f6rne\u011fin formatlanm\u0131\u015f bir dize olarak) kar\u015f\u0131la\u015ft\u0131rmak daha do\u011fru sonu\u00e7lar verebilir. Bu t\u00fcr stratejiler, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k nesne yap\u0131lar\u0131yla \u00e7al\u0131\u015f\u0131rken uygulaman\u0131z\u0131n performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<h2>Geli\u015fmi\u015f Teknikler ve Yayg\u0131n Hatalardan Ka\u00e7\u0131nma<\/h2>\n<p>PHP'de nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131 konusundaki temel ve uygulamal\u0131 bilgileri edindikten sonra, daha ileri d\u00fczey tekniklere ve s\u0131k\u00e7a yap\u0131lan hatalara odaklanmak, kodunuzun sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131racakt\u0131r. Bu b\u00f6l\u00fcmde, nesne seri hale getirme ile kar\u015f\u0131la\u015ft\u0131rma, tasar\u0131m desenlerindeki e\u015fitlik kavram\u0131 ve geli\u015ftirme s\u00fcrecinde mobil uyumlulu\u011fun \u00f6nemi gibi konulara de\u011finerek, daha kapsaml\u0131 bir bak\u0131\u015f a\u00e7\u0131s\u0131 sunaca\u011f\u0131z. Bu sayede, kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131n\u0131z\u0131 daha sofistike hale getirecek ve potansiyel tuzaklardan ka\u00e7\u0131nabileceksiniz.<\/p>\n<h3>Nesne Seri Hale Getirme ve Kar\u015f\u0131la\u015ft\u0131rma<\/h3>\n<p>Nesneleri kar\u015f\u0131la\u015ft\u0131rman\u0131n bir di\u011fer ilgin\u00e7 ve bazen kullan\u0131\u015fl\u0131 yolu, onlar\u0131 seri hale getirip (serialization) ard\u0131ndan olu\u015fan string ifadeleri kar\u015f\u0131la\u015ft\u0131rmakt\u0131r. PHP'de <code>serialize()<\/code> fonksiyonu bir nesneyi string'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve <code>unserialize()<\/code> ise bu string'i tekrar nesneye \u00e7evirir. E\u011fer iki nesnenin seri hale getirilmi\u015f halleri birbirine tam olarak e\u015fitse, bu, onlar\u0131n \u00f6zelliklerinin ve de\u011ferlerinin de ayn\u0131 oldu\u011fu anlam\u0131na gelebilir.<\/p>\n<pre><code>\n<?php\nclass Yapilandirma {\n    public $ayar1;\n    private $ayar2; \/\/ private \u00f6zelli\u011fi de serialize edilir\n\n    public function __construct($val1, $val2) {\n        $this->ayar1 = $val1;\n        $this->ayar2 = $val2;\n    }\n\n    public function getAyar2() {\n        return $this->ayar2;\n    }\n}\n\n$yapilandirma1 = new Yapilandirma(\"debug\", true);\n$yapilandirma2 = new Yapilandirma(\"debug\", true);\n$yapilandirma3 = new Yapilandirma(\"debug\", false);\n\n\/\/ Nesneleri seri hale getir\n$serialized1 = serialize($yapilandirma1);\n$serialized2 = serialize($yapilandirma2);\n$serialized3 = serialize($yapilandirma3);\n\necho \"<h3>Nesne Seri Hale Getirme ve Kar\u015f\u0131la\u015ft\u0131rma:<\/h3>\";\necho \"<p>Serile\u015ftirilmi\u015f Yap\u0131land\u0131rma 1: <code>\" . htmlspecialchars($serialized1) . \"<\/code><\/p>\";\necho \"<p>Serile\u015ftirilmi\u015f Yap\u0131land\u0131rma 2: <code>\" . htmlspecialchars($serialized2) . \"<\/code><\/p>\";\n\n\/\/ Seri hale getirilmi\u015f string'leri kar\u015f\u0131la\u015ft\u0131r\necho \"<h4>\\$serialized1 === \\$serialized2<\/h4>\";\nif ($serialized1 === $serialized2) {\n    echo \"<p>Serile\u015ftirilmi\u015f halleri kesin olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Serile\u015ftirilmi\u015f halleri kesin olarak E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n\necho \"<h4>\\$serialized1 === \\$serialized3<\/h4>\";\nif ($serialized1 === $serialized3) {\n    echo \"<p>Serile\u015ftirilmi\u015f halleri kesin olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Serile\u015ftirilmi\u015f halleri kesin olarak E\u015e\u0130T DE\u011e\u0130L: Ayar2 farkl\u0131.<\/p>\";\n}\n\n\/\/ Orijinal nesne == kar\u015f\u0131la\u015ft\u0131rmas\u0131\necho \"<h4>\\$yapilandirma1 == \\$yapilandirma2<\/h4>\";\nif ($yapilandirma1 == $yapilandirma2) {\n    echo \"<p>Nesneler de\u011fer olarak E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Nesneler de\u011fer olarak E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu y\u00f6ntem, \u00f6zellikle bir nesnenin t\u00fcm i\u00e7 durumunun (private ve protected \u00f6zellikler dahil) ayn\u0131 olup olmad\u0131\u011f\u0131n\u0131 h\u0131zl\u0131ca kontrol etmek istedi\u011finizde kullan\u0131\u015fl\u0131 olabilir. Ancak, baz\u0131 dezavantajlar\u0131 vard\u0131r: nesnelerin referanslar\u0131n\u0131 i\u00e7ermez (referanslar seri hale getirilemez), performans a\u00e7\u0131s\u0131ndan daha maliyetli olabilir ve \u00f6zellikle b\u00fcy\u00fck veya karma\u015f\u0131k nesnelerde \u00e7ok uzun stringler \u00fcretebilir. Ayr\u0131ca, e\u011fer bir nesne seri hale getirilemeyen kaynaklar\u0131 (veritaban\u0131 ba\u011flant\u0131lar\u0131, dosya tan\u0131t\u0131c\u0131lar\u0131 vb.) i\u00e7eriyorsa bu y\u00f6ntem sorun \u00e7\u0131karabilir. Bu nedenle, genel bir \u00e7\u00f6z\u00fcm yerine, belirli durumlar i\u00e7in d\u00fc\u015f\u00fcn\u00fclmelidir.<\/p>\n<h3>Tasar\u0131m Desenlerinde Nesne E\u015fitli\u011fi<\/h3>\n<p>Nesne e\u015fitli\u011fi kavram\u0131, bir\u00e7ok tasar\u0131m deseninde \u00f6nemli bir rol oynar. Do\u011fru kar\u015f\u0131la\u015ft\u0131rma mekanizmalar\u0131n\u0131 anlamak ve uygulamak, bu desenlerin do\u011fru \u00e7al\u0131\u015fmas\u0131n\u0131 ve uygulaman\u0131z\u0131n mimarisinin sa\u011flam olmas\u0131n\u0131 sa\u011flar.<\/p>\n<ul>\n<li><strong>Singleton Deseni:<\/strong> Bu desende, bir s\u0131n\u0131f\u0131n yaln\u0131zca tek bir \u00f6rne\u011fi olmas\u0131n\u0131 sa\u011flamak temel ama\u00e7t\u0131r. Bu durumda, yeni bir \u00f6rnek istemi geldi\u011finde mevcut \u00f6rnekle istenen \u00f6rnek aras\u0131nda <code>===<\/code> (referans kar\u015f\u0131la\u015ft\u0131rmas\u0131) kullanarak bir kontrol yapmak esast\u0131r. E\u011fer ayn\u0131 \u00f6rne\u011fi d\u00f6nd\u00fcrmeniz gerekiyorsa, referans e\u015fitli\u011fi kontrol\u00fc hayati \u00f6neme sahiptir.<\/li>\n<li><strong>Value Object Deseni:<\/strong> \"De\u011fer Nesneleri\" (Value Objects), kimli\u011fi olmayan, sadece de\u011ferleri ile tan\u0131mlanan nesnelerdir (\u00f6rne\u011fin, bir para birimi nesnesi, bir tarih aral\u0131\u011f\u0131 nesnesi). \u0130ki de\u011fer nesnesinin ayn\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in, genellikle t\u00fcm \u00f6zelliklerinin de\u011fer olarak e\u015fit olmas\u0131 gerekir. Bu durumda, \u00f6zel bir <code>equals()<\/code> metodu yazmak veya PHP'nin <code>==<\/code> operat\u00f6r\u00fcn\u00fcn varsay\u0131lan davran\u0131\u015f\u0131na g\u00fcvenmek (e\u011fer t\u00fcm \u00f6zellikler public ise) uygun bir yakla\u015f\u0131md\u0131r. \u00d6nemli olan, de\u011fer nesnelerinin mutlak (immutable) olmas\u0131 ve de\u011fi\u015fmemesidir.<\/li>\n<li><strong>Entity Deseni:<\/strong> \"Varl\u0131k Nesneleri\" (Entities), bir kimli\u011fe (genellikle bir ID) sahip olan ve zaman i\u00e7inde durumu de\u011fi\u015febilen nesnelerdir (\u00f6rne\u011fin, bir Kullan\u0131c\u0131, bir \u00dcr\u00fcn). \u0130ki varl\u0131k nesnesinin ayn\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol ederken, genellikle onlar\u0131n benzersiz kimliklerine (ID'lerine) bakmak yeterlidir. Yani, ayn\u0131 ID'ye sahip iki varl\u0131k nesnesi, farkl\u0131 bellek adreslerinde olsalar bile ayn\u0131 varl\u0131\u011f\u0131 temsil ederler. Bu durumda, \u00f6zel bir <code>equals()<\/code> metodu, sadece ID'leri kar\u015f\u0131la\u015ft\u0131racak \u015fekilde yaz\u0131labilir.<\/li>\n<\/ul>\n<pre><code>\n<?php\n\/\/ Value Object \u00d6rne\u011fi\nclass ParaBirimi {\n    private $miktar;\n    private $kur;\n\n    public function __construct(float $miktar, string $kur) {\n        $this->miktar = $miktar;\n        $this->kur = $kur;\n    }\n\n    public function equals(ParaBirimi $other): bool {\n        return $this->miktar === $other->miktar && $this->kur === $other->kur;\n    }\n}\n\n$usd1 = new ParaBirimi(100.0, \"USD\");\n$usd2 = new ParaBirimi(100.0, \"USD\");\n$eur1 = new ParaBirimi(100.0, \"EUR\");\n\necho \"<h3>Tasar\u0131m Desenlerinde E\u015fitlik: Value Object<\/h3>\";\necho \"<h4>\\$usd1->equals(\\$usd2)<\/h4>\";\nif ($usd1->equals($usd2)) {\n    echo \"<p>Para Birimi Nesneleri \u00f6zel equals ile E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Para Birimi Nesneleri \u00f6zel equals ile E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\necho \"<h4>\\$usd1 == \\$usd2 (varsay\u0131lan ==)<\/h4>\";\nif ($usd1 == $usd2) { \/\/ PHP'nin == operat\u00f6r\u00fc private \u00f6zellikleri de kar\u015f\u0131la\u015ft\u0131r\u0131r\n    echo \"<p>Para Birimi Nesneleri varsay\u0131lan == ile E\u015e\u0130T.<\/p>\";\n} else {\n    echo \"<p>Para Birimi Nesneleri varsay\u0131lan == ile E\u015e\u0130T DE\u011e\u0130L.<\/p>\";\n}\n?>\n<\/pre>\n<p><\/code><\/p>\n<div class=\"uzman-ipucu\">\n  Uzman \u0130pucu: Value Object deseninde, nesnelerin mutlak (immutable) olmas\u0131 ve <code>equals()<\/code> metodunun tutarl\u0131, yans\u0131t\u0131c\u0131, simetrik ve ge\u00e7i\u015fli olmas\u0131 \u00f6nemlidir. Bu, de\u011fer nesnelerinin g\u00fcvenilir bir \u015fekilde kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.\n<\/div>\n<h3>Mobil Uyumlu HTML ve Duyarl\u0131 Tasar\u0131mda Nesne Kar\u015f\u0131la\u015ft\u0131rma<\/h3>\n<p>PHP'de nesne kar\u015f\u0131la\u015ft\u0131rma, genellikle arka u\u00e7 (backend) i\u015f mant\u0131\u011f\u0131yla ilgili olsa da, bu kar\u015f\u0131la\u015ft\u0131rmalar\u0131n sonu\u00e7lar\u0131 s\u0131kl\u0131kla \u00f6n u\u00e7 (frontend) ve dolay\u0131s\u0131yla mobil uyumlu tasar\u0131m \u00fczerinde dolayl\u0131 etkilere sahip olabilir. \u00d6rne\u011fin, belirli bir nesne t\u00fcr\u00fcne veya de\u011ferine g\u00f6re farkl\u0131 g\u00f6rsel bile\u015fenler g\u00f6stermek veya bir kullan\u0131c\u0131n\u0131n yetkilerine g\u00f6re aray\u00fcz\u00fc \u015fekillendirmek gibi senaryolarda nesne kar\u015f\u0131la\u015ft\u0131rma sonu\u00e7lar\u0131 kullan\u0131l\u0131r. Duyarl\u0131 bir web sitesi veya uygulaman\u0131n kullan\u0131c\u0131 deneyimi, arka u\u00e7tan gelen verilerin ve bu veriler \u00fczerindeki mant\u0131ksal kontrollerin sa\u011flaml\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r.<\/p>\n<p>PHP taraf\u0131nda yapt\u0131\u011f\u0131n\u0131z nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131, hangi verilerin hangi formatta ve hangi ko\u015fullar alt\u0131nda frontend'e g\u00f6nderilece\u011fini belirler. \u00d6rne\u011fin, bir \"\u00fcr\u00fcn\" nesnesinin stokta olup olmad\u0131\u011f\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131rma (<code>$product->stock > 0<\/code>) ve buna g\u00f6re mobil aray\u00fczde \"Sepete Ekle\" d\u00fc\u011fmesini g\u00f6sterme veya gizleme karar\u0131 PHP taraf\u0131nda verilir. Frontend ise bu karara g\u00f6re HTML\/CSS\/JavaScript ile aray\u00fcz\u00fc duyarl\u0131 bir \u015fekilde olu\u015fturur. Burada bir \u00f6rnek olarak, mobil cihazlar i\u00e7in farkl\u0131 bir d\u00fczen sa\u011flayan temel bir CSS media query \u00f6rne\u011fi g\u00f6sterebiliriz. Bu, PHP'nin do\u011frudan bir \u00e7\u0131kt\u0131s\u0131 olmasa da, backend mant\u0131\u011f\u0131n\u0131n frontend'i nas\u0131l etkiledi\u011fini vurgulamak i\u00e7in bir ba\u011flam sa\u011flar.<\/p>\n<pre><code>\n<!DOCTYPE html><body>\n    <div class=\"container\">\n        <h1>\u00dcr\u00fcn Listesi<\/h1>\n        <?php\n        \/\/ PHP ile \u00fcr\u00fcn verilerini olu\u015ftur ve kar\u015f\u0131la\u015ft\u0131rma yap\n        class FrontendProduct {\n            public $id;\n            public $name;\n            public $price;\n            public $stock;\n\n            public function __construct($id, $name, $price, $stock) {\n                $this->id = $id;\n                $this->name = $name;\n                $this->price = $price;\n                $this->stock = $stock;\n            }\n        }\n\n        $product1 = new FrontendProduct(1, \"Ak\u0131ll\u0131 Telefon\", 7500.00, 10);\n        $product2 = new FrontendProduct(2, \"Bluetooth Kulakl\u0131k\", 800.00, 0); \/\/ Stokta yok\n        $product3 = new FrontendProduct(3, \"Ak\u0131ll\u0131 Saat\", 1500.00, 5);\n\n        $products = [$product1, $product2, $product3];\n\n        foreach ($products as $product) {\n            echo '<div class=\"product-card\">';\n            echo '<h3>' . htmlspecialchars($product->name) . '<\/h3>';\n            echo '<p>Fiyat: ' . number_format($product->price, 2) . ' TL<\/p>';\n            \n            \/\/ PHP nesne kar\u015f\u0131la\u015ft\u0131rma sonucuyla aray\u00fcz\u00fc etkileme\n            if ($product->stock > 0) {\n                echo '<button class=\"add-to-cart-button\">Sepete Ekle<\/button>';\n                echo '<p>Stok: ' . $product->stock . ' adet<\/p>';\n            } else {\n                echo '<p class=\"out-of-stock\">Stokta Yok<\/p>';\n            }\n            echo '<\/div>';\n        }\n        ?>\n    <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, PHP taraf\u0131nda her <code>FrontendProduct<\/code> nesnesinin <code>stock<\/code> \u00f6zelli\u011fi kar\u015f\u0131la\u015ft\u0131r\u0131larak (<code>$product->stock > 0<\/code>), \u00fcr\u00fcn\u00fcn stokta olup olmad\u0131\u011f\u0131 belirlenir. Bu kar\u015f\u0131la\u015ft\u0131rma sonucuna g\u00f6re, HTML \u00e7\u0131kt\u0131s\u0131nda \"Sepete Ekle\" butonu g\u00f6sterilir veya \"Stokta Yok\" mesaj\u0131 verilir. Bu HTML \u00e7\u0131kt\u0131s\u0131, CSS'deki <code>@media<\/code> kural\u0131 sayesinde farkl\u0131 ekran boyutlar\u0131nda (\u00f6rne\u011fin mobil cihazlarda) farkl\u0131 \u015fekillerde g\u00f6r\u00fcnt\u00fclenecektir. Dolay\u0131s\u0131yla, PHP'deki nesne kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131, kullan\u0131c\u0131ya sunulan son aray\u00fcz\u00fcn dinamik olarak de\u011fi\u015fmesinde \u00f6nemli bir rol oynar ve duyarl\u0131 tasar\u0131mla birle\u015fti\u011finde esnek bir kullan\u0131c\u0131 deneyimi sa\u011flar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 rehberde, PHP'de nesne kar\u015f\u0131la\u015ft\u0131rman\u0131n inceliklerini, <code>==<\/code> ve <code>===<\/code> operat\u00f6rlerinin temel farklar\u0131ndan ba\u015flayarak, <code>__clone()<\/code> metodu, \u00f6zel <code>equals()<\/code> fonksiyonlar\u0131 ve karma\u015f\u0131k nesne yap\u0131lar\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131rmaya kadar bir\u00e7ok farkl\u0131 a\u00e7\u0131dan ele ald\u0131k. Nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131, PHP uygulamalar\u0131n\u0131zda do\u011fru ve g\u00fcvenilir mant\u0131k kurman\u0131n, hatalar\u0131 \u00f6nlemenin ve performansl\u0131 \u00e7\u00f6z\u00fcmler \u00fcretmenin temel ta\u015flar\u0131ndan biridir. Art\u0131k iki nesnenin ne zaman referans olarak, ne zaman de\u011fer olarak e\u015fit oldu\u011funu net bir \u015fekilde ay\u0131rt edebiliyor, \u00f6zel ihtiya\u00e7lar\u0131n\u0131za g\u00f6re kendi kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131n\u0131z\u0131 geli\u015ftirebiliyor ve performans optimizasyonlar\u0131 i\u00e7in do\u011fru stratejileri uygulayabiliyorsunuz.<\/p>\n<p>Do\u011fru operat\u00f6r\u00fc do\u011fru yerde kullanmak, beklenmedik davran\u0131\u015flardan ka\u00e7\u0131nman\u0131n ve kodunuzu daha okunabilir hale getirmenin anahtar\u0131d\u0131r. Unutmay\u0131n, nesne y\u00f6nelimli programlamada \"e\u015fitlik\" kavram\u0131, ba\u011flama g\u00f6re farkl\u0131 anlamlar ta\u015f\u0131yabilir ve bu farkl\u0131l\u0131klar\u0131 anlamak, daha g\u00fc\u00e7l\u00fc ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmenizi sa\u011flar.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n        <strong>PHP'de <code>==<\/code> ve <code>===<\/code> operat\u00f6rleri aras\u0131ndaki temel fark nedir?<\/strong><\/p>\n<p><code>==<\/code> (e\u015fitlik) operat\u00f6r\u00fc, iki nesnenin ayn\u0131 s\u0131n\u0131ftan olup olmad\u0131\u011f\u0131n\u0131 ve ayn\u0131 \u00f6zellik de\u011ferlerine sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder (de\u011fer kar\u015f\u0131la\u015ft\u0131rmas\u0131). Bellekteki konumlar\u0131 \u00f6nemli de\u011fildir. <code>===<\/code> (kesin e\u015fitlik) operat\u00f6r\u00fc ise, iki de\u011fi\u015fkenin ayn\u0131 nesnenin ayn\u0131 \u00f6rne\u011fini referans edip etmedi\u011fini kontrol eder, yani bellekteki ayn\u0131 adresi i\u015faret edip etmediklerine bakar (referans kar\u015f\u0131la\u015ft\u0131rmas\u0131).<\/p>\n<\/li>\n<li>\n        <strong>Kendi \u00f6zel nesne kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131m\u0131 nas\u0131l olu\u015fturabilirim?<\/strong><\/p>\n<p>PHP'de do\u011frudan bir <code>__equals()<\/code> sihirli metodu bulunmad\u0131\u011f\u0131 i\u00e7in, genellikle s\u0131n\u0131f\u0131n\u0131z\u0131n i\u00e7ine <code>equals()<\/code> veya <code>isEqualTo()<\/code> gibi kendi \u00f6zel metodunuzu tan\u0131mlars\u0131n\u0131z. Bu metot, parametre olarak ba\u015fka bir nesne al\u0131r ve sizin belirledi\u011finiz kriterlere (\u00f6rne\u011fin, sadece belirli \u00f6zelliklerin e\u015fitli\u011fi, i\u00e7 i\u00e7e nesnelerin derinlemesine kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131) g\u00f6re <code>true<\/code> veya <code>false<\/code> d\u00f6nd\u00fcr\u00fcr.<\/p>\n<\/li>\n<li>\n        <strong><code>__clone()<\/code> metodu nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131n\u0131 nas\u0131l etkiler?<\/strong><\/p>\n<p><code>clone<\/code> anahtar kelimesi ile bir nesneyi kopyalad\u0131\u011f\u0131n\u0131zda, varsay\u0131lan olarak s\u0131\u011f bir kopyalama yap\u0131l\u0131r. Yani, orijinal nesnenin \u00f6zellikleri yeni nesneye kopyalan\u0131r, ancak \u00f6zellikler aras\u0131nda ba\u015fka nesnelere referanslar varsa, bu referanslar kopyalanan nesnede de ayn\u0131 orijinal nesneleri i\u015faret etmeye devam eder. <code>__clone()<\/code> metodu, bu davran\u0131\u015f\u0131 de\u011fi\u015ftirmek ve derinlemesine kopyalama yapmak i\u00e7in kullan\u0131l\u0131r. Derin kopyalama sayesinde, orijinal nesne ile kopyalanan nesne i\u00e7 i\u00e7e ge\u00e7mi\u015f nesneler a\u00e7\u0131s\u0131ndan da tamamen ba\u011f\u0131ms\u0131z hale gelir, bu da daha do\u011fru ve ba\u011f\u0131ms\u0131z kar\u015f\u0131la\u015ft\u0131rmalar yap\u0131lmas\u0131na olanak tan\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>B\u00fcy\u00fck nesne koleksiyonlar\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131rken performans ipu\u00e7lar\u0131 nelerdir?<\/strong><\/p>\n<p>B\u00fcy\u00fck koleksiyonlar\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131rken performans\u0131 art\u0131rmak i\u00e7in birka\u00e7 strateji izlenebilir: \u00f6ncelikle koleksiyonlar\u0131n boyutlar\u0131n\u0131 kontrol edin; e\u011fer boyutlar farkl\u0131ysa, e\u015fit olamazlar. \u0130kinci olarak, her nesnenin benzersiz bir kimli\u011fi (ID gibi) varsa, \u00f6ncelikle bu kimlikleri kar\u015f\u0131la\u015ft\u0131r\u0131n. Son olarak, \u00f6zel <code>equals()<\/code> metotlar\u0131n\u0131zda \"erken \u00e7\u0131k\u0131\u015f\" stratejisi uygulay\u0131n; yani farkl\u0131l\u0131klar\u0131 m\u00fcmk\u00fcn olan en erken a\u015famada tespit edip kar\u015f\u0131la\u015ft\u0131rma d\u00f6ng\u00fcs\u00fcnden \u00e7\u0131k\u0131n.<\/p>\n<\/li>\n<li>\n        <strong>Nesnelerin serile\u015ftirilmi\u015f halini kar\u015f\u0131la\u015ft\u0131rmak g\u00fcvenli ve verimli bir y\u00f6ntem midir?<\/strong><\/p>\n<p>Nesnelerin serile\u015ftirilmi\u015f halini (<code>serialize()<\/code> ile elde edilen string'leri) kar\u015f\u0131la\u015ft\u0131rmak, nesnelerin t\u00fcm i\u00e7 durumlar\u0131n\u0131n (private ve protected \u00f6zellikler dahil) ayn\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131\u015fl\u0131 olabilir. Ancak, bu y\u00f6ntem her zaman g\u00fcvenli veya verimli de\u011fildir. Performans a\u00e7\u0131s\u0131ndan daha maliyetli olabilir, \u00e7ok uzun stringler \u00fcretebilir ve serile\u015ftirilemeyen kaynaklar\u0131 (veritaban\u0131 ba\u011flant\u0131lar\u0131 gibi) i\u00e7eren nesnelerde sorun \u00e7\u0131karabilir. Bu nedenle, genel bir kar\u015f\u0131la\u015ft\u0131rma \u00e7\u00f6z\u00fcm\u00fc yerine, belirli durumlar i\u00e7in dikkatli bir \u015fekilde de\u011ferlendirilmelidir.<\/p>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"PHP&#8217;de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin &#8220;ayn\u0131&#8221; olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde,&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[133],"tags":[],"class_list":{"0":"post-32722","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18<\/title>\n<meta name=\"description\" content=\"PHP&#039;de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin &quot;ayn\u0131&quot; olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde, PHP&#039;deki `==` ve `===` operat\u00f6rlerinin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine inceleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6rnekler sunacak ve performans ipu\u00e7lar\u0131yla bilginizi peki\u015ftirece\u011fiz. Bu sayede, uygulaman\u0131zda do\u011fru ve g\u00fcvenilir nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131 yaparak olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebileceksiniz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-\ud83d\udc18\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18\" \/>\n<meta property=\"og:description\" content=\"PHP&#039;de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin &quot;ayn\u0131&quot; olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde, PHP&#039;deki `==` ve `===` operat\u00f6rlerinin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine inceleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6rnekler sunacak ve performans ipu\u00e7lar\u0131yla bilginizi peki\u015ftirece\u011fiz. Bu sayede, uygulaman\u0131zda do\u011fru ve g\u00fcvenilir nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131 yaparak olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebileceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-\ud83d\udc18\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-25T03:01:38+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18\",\"datePublished\":\"2025-10-25T03:01:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/\"},\"wordCount\":4545,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PHP\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/\",\"name\":\"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-25T03:01:38+00:00\",\"description\":\"PHP'de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin \\\"ayn\u0131\\\" olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde, PHP'deki `==` ve `===` operat\u00f6rlerinin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine inceleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6rnekler sunacak ve performans ipu\u00e7lar\u0131yla bilginizi peki\u015ftirece\u011fiz. Bu sayede, uygulaman\u0131zda do\u011fru ve g\u00fcvenilir nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131 yaparak olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebileceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18","description":"PHP'de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin \"ayn\u0131\" olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde, PHP'deki `==` ve `===` operat\u00f6rlerinin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine inceleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6rnekler sunacak ve performans ipu\u00e7lar\u0131yla bilginizi peki\u015ftirece\u011fiz. Bu sayede, uygulaman\u0131zda do\u011fru ve g\u00fcvenilir nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131 yaparak olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebileceksiniz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-\ud83d\udc18\/","og_locale":"tr_TR","og_type":"article","og_title":"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18","og_description":"PHP'de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin \"ayn\u0131\" olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde, PHP'deki `==` ve `===` operat\u00f6rlerinin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine inceleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6rnekler sunacak ve performans ipu\u00e7lar\u0131yla bilginizi peki\u015ftirece\u011fiz. Bu sayede, uygulaman\u0131zda do\u011fru ve g\u00fcvenilir nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131 yaparak olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebileceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-\ud83d\udc18\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-25T03:01:38+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"5 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18","datePublished":"2025-10-25T03:01:38+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/"},"wordCount":4545,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PHP"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/","url":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/","name":"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-25T03:01:38+00:00","description":"PHP'de nesneleri kar\u015f\u0131la\u015ft\u0131rmak, beklenmedik sonu\u00e7lar do\u011furabilen kritik bir konudur. \u0130ki nesnenin \"ayn\u0131\" olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Bu rehberde, PHP'deki `==` ve `===` operat\u00f6rlerinin nesne kar\u015f\u0131la\u015ft\u0131rmas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 derinlemesine inceleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla ad\u0131m ad\u0131m \u00f6rnekler sunacak ve performans ipu\u00e7lar\u0131yla bilginizi peki\u015ftirece\u011fiz. Bu sayede, uygulaman\u0131zda do\u011fru ve g\u00fcvenilir nesne kar\u015f\u0131la\u015ft\u0131rmalar\u0131 yaparak olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7ebileceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/php-nesne-karsilastirma-adim-adim-kapsamli-rehber-%f0%9f%90%98\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP Nesne Kar\u015f\u0131la\u015ft\u0131rma: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber \ud83d\udc18"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32722"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32722\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}