PHP OOP (Nesne Yönelimli Programlama)

OOP Nedir ve Neden Gereklidir

Sınıf (Class)

<?php
class Isim {
// Metotlar
}
?>
<?php 
class Merhaba {
function merhabaDe() {
echo 'Merhaba';
}
}
?>

Sınıftan Obje (Object) Tanımlama

<?php 
class Merhaba {
function merhabaDe() {
echo 'Merhaba';
}
}
$selamlamaMesaji = new Merhaba();
?>

Metotlar ve Özellikler (Properties)

<?php 
class Merhaba {
function merhabaDe() {
echo 'Merhaba';
}
}
$selamlamaMesaji = new Merhaba();
$selamlamaMesaji -> merhabaDe();
?>
<?php 
class Merhaba {
function merhabaDe($isim) {
$this -> isim = $isim;
echo 'Merhaba '. $this->isim;
}
}
$selamlamaMesaji = new Merhaba();
$selamlamaMesaji -> merhabaDe("Uğur");
?>

Yapıcı ve Yıkıcı Metotlar (__construct() ve __destruct())

<?php 
class Merhaba {
function __construct() {
echo 'Merhaba';
}
}
$selamlamaMesaji = new Merhaba();
?>
<?php 
class Merhaba {
function __construct() {
echo 'Merhaba ' ;
}
function isimAl($isim){
$this -> isim = $isim;
echo $isim;
}
function __destruct() {
echo ', güle güle...';
}
}
$selamlamaMesaji = new Merhaba();
$selamlamaMesaji -> isimAl('Uğur');
?>

OOP’de Temel Prensipler, Abstract (Soyutlama)

<?php 
class karsilamaMesaji {
public $isim;
public $yas;
private $mesaj = " yaşındasın";

public function yazdir(){
return $this->isim . ", " . $this->yas . $this->mesaj;
}

}
$_km = new karsilamaMesaji();$_km->isim = "Uğur";
$_km->yas = 32;
# $_km->mesaj = "";
# bu kullanım hata verir.
# type 1 -- Cannot access private property karsilamaMesaji::$mesaj
echo $_km->yazdir();?>

OOP’de Temel Prensipler, Inheritance (Kalıtım)

<?php 
# ilk olarak ana Class’ı tanımlıyoruz.
# bu class Merhaba yazısını gönderecek.
class cinsiyeteGoreSelamla {
public function fonk_Merhaba(){
return "Merhaba ";
}

}
# extends anahtar kelimesi ile alt Class’ı oluşturuyoruz.
# alt Class’ın ismi hanim_bey
class hanim_bey extends cinsiyeteGoreSelamla{
# dışarıdan erişilebilir bir fonksiyon tanımlıyoruz.
# isim ve cinsiyet parametrelerini alıyor.
public function fonk_Tamamla($isim, $cinsiyet){
# ilk olarak ana Class’taki fonksiyonu çağırıyoruz.
# ana fonksiyona ulaşmak için parent:: metodu uygulanır.
echo parent::fonk_Merhaba();

# bir koşullu döngü ile cinsiyete göre işlem yaptırıyoruz.
# strtolower ile gelen veriyi küçük harfe çeviriyoruz.
# kişi BAY, Bay veya bay yazsa da hepsi bay olarak değerlendirilecek.
# maksat, hata olasılığını aza indirmek.
# aslına bu veriler bir form sayfasından gelmeli ama şimdilik böyle yapıyoruz.
# dilerseniz captcha uygulamasında gördüğünüz gibi formdan POST edin.
# karara göre Bey veya Hanım kelimeleri geri dönüyor.
# eğer anlamsız bir şey ise cinsiyet anlaşılamadı geri dönüyor.
if("bay"==strtolower($cinsiyet)){
return $isim . " Bey";
}else if("bayan"==strtolower($cinsiyet)){
return $isim . " Hanım";
}else{
return $isim . " cinsiyetiniz anlaşılamadı";
}
}
}
# alt sınıf olarak türetilmiş Class’ı tanımlıyoruz.
$_mesaj = new hanim_bey();
# alt Class içindeki fonksiyona parametre değerleri gönderilerek çağırılıyor.
echo $_mesaj->fonk_Tamamla("Uğur","bayan");
?>

OOP’de Temel Prensipler, Interface (Arayüz)

<?php
interface ArayuzIsmi{
public function fonksiyon_1($parametre1, $parametre2);
public function fonksiyon_2($parametre1);
}
class sinifIsmi implements ArayuzIsmi {
public function fonksiyon_1($parametre1, $parametre2){
$parametre1 = $this -> $parametre1;
$parametre2 = $this -> $parametre2;
}
public function fonksiyon_2($parametre3){
$parametre3 = $this -> $parametre3;
}
}
?>
<?php
interface ArayuzIsmi{
public function fonksiyon_1($parametre1, $parametre2);
}
interface AltArayuzİsmi extend ArayuzIsmi{
public function fonksiyon_2($parametre1);
}
class sinifIsmi implements ArayuzIsmi {
public function fonksiyon_1($parametre1, $parametre2){
$parametre1 = $this -> $parametre1;
$parametre2 = $this -> $parametre2;
}
public function fonksiyon_2($parametre3){
$parametre3 = $this -> $parametre3;
}
}
?>
<?php
# interface ve kuralları tanımlanıyor.
# kurallara göre iki fonksiyon tanımlanıyor.
# her iki fonksiyonun da parametreleri gönderilmek zorunda.
# bu fonksiyonlar sonraki Class içinde oluşturulmuş.
interface veritabaniBaglantisi{
public function kullaniciBilgileri($db_kullaniciIsim, $db_sifre);
public function veritabaniAdi($db_isim);
}
# interface'den türetilmiş Class'ımız..
class baglantiKur implements veritabaniBaglantisi {
# bu ürettiğimiz metot, veritabanı kullanıcı adı ve şifresini alacak
public function kullaniciBilgileri($db_kullaniciIsim, $db_sifre){
# değişkenler çekiliyor.
$this -> $db_kullaniciIsim = $db_kullaniciIsim;
$this -> $db_sifre = $db_sifre;
# global ön eki ile bir değişken tanımlıyoruz.
# global tanımı ile diğer metotlardan da bu değişkene erişebiliriz.
# değişken, veritabanı bağlantısının bilgilerini taşıyacak.
global $baglanti;
# veritabanına mysql_connect metodu ile bağlanıyoruz.
# localhost tanımı kendi server'i üzerinde olduğunu tanımlıyor.
# veritabanı kullanıcı adını giriyoruz.
# şifreyi giriyoruz.
# bu bilgiler, kodların nereden geldiğini görmek için son satırlara bakın.
# fonksiyonlar nesnelerden çağırılıyor ve argümanları tanımlanıyor.
$baglanti = mysql_connect('localhost', $db_kullaniciIsim, $db_sifre);
# eğer bağlantı sağlanırsa true sonucunu verir.
# böylece if döngüsü içine girilir.
if (!$baglanti) {
# eğer false ise, hata mesajı yazdırıyoruz.
die('Veritabanına bağlanamadı: ' . mysql_error() . '<br>');
}else{
# eğer girdiyse, girdiğini belirtiyoruz.
echo "Veritabanına bağlandı!" . PHP_EOL . '<br>';
}
}

# ikinci metodumuz da veritabanı ismini parametre olarak alıyor.
public function veritabaniAdi($db_isim){
# önceki metotta oluşturduğumuz veritabanı bağlantısına erişiyoruz.
global $baglanti;
# metota argüman olarak gelen değişkeni çekiyoruz.
$this -> $db_isim = $db_isim;
# veritabanında tabloya bağlanıyoruz.
@mysql_select_db($db_isim);

# eğer veritabanı seçildiyse true değeri gelecek.
$db_secildi = mysql_select_db($db_isim, $baglanti);
# tabloya bağlanma durumunu yine if döngüsü ile yazdırıyoruz.
if (!$db_secildi) {
die ('Tabloya bağlanamadı: ' . mysql_error());
}else {
echo 'Tablo:' . $db_isim . ' bağlantısı başarılı bir şekilde kuruldu.<br>';
}
# bir SQL sorgusu oluşturuyoruz
# tablomuzda 3 sütun var. isim, soyisim ve yas.
# bu tablolarda yer alan değerleri çekip yazdıracağız.
$sql = "SELECT isim,soyisim,yas FROM tablo";
# sorgu ile gelen değerleri bir değişkene aktarıyoruz.
$sorgu_sonucu = mysql_query( $sql, $baglanti );
# bir while döngüsü ile satırları çekiyoruz.
while($satir = mysql_fetch_assoc($sorgu_sonucu)){
# her bir satır değerini birleştirerek tek tek yazdırıyoruz.
echo "<hr>İSİM:{$satir['isim']} <br> ".
"SOYİSİM: {$satir['soyisim']} <br> ".
"YAŞ: {$satir['yas']} <hr>";
}
# veritabanı bağlantısını kapatıyoruz.
mysql_close($baglanti);
}
}
# METOTLAR ÇALIŞTIRILIYOR
# yeni bir baglantiKur nesnesi tanımlanıyor.
$baglantiNesnesi = new baglantiKur;
# metotlara parametre değerleri gönderiliyor.
$baglantiNesnesi->kullaniciBilgileri("ugur", 1234, "ugurgelisken_databaseIsmi");
$baglantiNesnesi->veritabaniAdi("ugurgelisken_databaseIsmi");
?>

OOP’de Temel Prensipler, Polymorphism (Çok Biçimlilik)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ALAN HESAPLA</title>
</head>
<body>
<div>
<p>Kare Alanı Hesapla</p>
<form action="polymorphism.class.php" method="POST">
a: <input type="text" name="kenar_uzunlugu" size="3" >
<input type="submit" name="submitKare" value="Hesapla">
</form>
</div>
<hr>
<div>
<p>Daire Alanı Hesapla</p>
<form action="polymorphism.class.php" method="POST">
r: <input type="text" name="yaricap_uzunlugu" size="3" >
<input type="submit" name="submitDaire" value="Hesapla">
</form>
</div>
<hr>
</body>
</html>
<!-- Buraya kadar form sayfamız HTML5 sayfası olarak hazırlandı -->
<?php
# soyut bir Sekil ana Class'ı oluşturuyoruz.
class Sekil {
# iki adet parametre alacağız. x ve y;
# bunlardan x olanına kare uzunluğu ve daire yarıçap değerleri gelecek.
# y değerine de 3.14 olan PI değeri gelecek.
private $x = 0;
private $y = 0;
# yapıcı metot ile bu Class içindeki alan fonksiyonunu çağırıyoruz.
# self:: anahtar kelimesi ile kendi Class'ı içindeki alan fonksiyonu belirtiyoruz.
function __construct(){
self::alan();
}
# sayfa açıldığında bu mesaj formun altında yer alacak.
# sayfanın sonuna bakarsanız $mesaj = new Sekil(); ile Class'ın başlatıldığını göreceksiniz.
public function alan() {
echo "Alan hesabını yapmak için değer girin ve Hesapla butonuna basınız.<br>";
}
}
# Sekil Class'ından Kare adında alt Class tanımlanıyor.
class Kare extends Sekil {
# yapıcı metot ile hemen başlatılıyor.
function __construct($x) {
# parametre değeri alınıyor.
$this->x = $x;
}
# Karenin alanı hesaplanıp return olarak gönderiliyor.
function alan() {
echo "Karenin alanı: " .$this->x * $this->x;
}
}
# Sekil Class'ından Daire adında alt Class tanımlanıyor.
class Daire extends Sekil {
# parametre değeri alınıyor.
function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
# Dairenin alanı hesaplanıp return olarak gönderiliyor.
function alan() {
echo "Dairenin alanı: " . $this->x * $this->x * $this->y / 4;
}
}
# BURAYA DİKKAT
# form sayfamızda 2 adet submit, yani Hesapla butonumuz var.
# butonların name özelliğine bakarak if döngülerimizi kuruyoruz.
# eğer submitKare veya submitDaire değerlerinden biri varsa
# onla ilgili kod bloğu çalıştırılıyor.
# kod bloklarında birer alt Class tanımlanıyor.
# parametre değerleri gönderiliyor.
# sonra da alan metotları çağırılıyor.
if (isset($_POST["submitKare"])) {
$alanKare = new Kare($_POST["kenar_uzunlugu"]);
$alanKare->alan();
} else if (isset($_POST["submitDaire"])) {
$alanDaire = new Daire($_POST["yaricap_uzunlugu"], "3.14");
$alanDaire->alan();
} else {
# ana Class'taki alan metodu çağırılıyor.
$mesaj = new Sekil();
}
?>

--

--

Full-stack Developer [ UI / UX | JAM Stack | ME(A,R,V)N | LAMP ], Author, Pro Gamer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Uğur GELİŞKEN

Full-stack Developer [ UI / UX | JAM Stack | ME(A,R,V)N | LAMP ], Author, Pro Gamer