koddla

Yazılımcıları bilgi ile güçlendirir.

PHP Fonksiyonel Programlama

PHP’nin işlevsel programlaması fonksiyonlara dayanır. PHP’deki fonksiyonlar, bir dizi eylemi gerçekleştirmek için düzenli, yeniden kullanılabilir kod sağlar. Fonksiyonlar kodlama sürecini basitleştirir, gereksiz mantığı önler ve kodun takip edilmesini kolaylaştırır. Bu konuda PHP’de fonksiyonları, argümanları, parametreleri, dönüş deyimlerini ve kapsamın bildirimini ve kullanımını inceleyeceğiz.

Closure

Bir closure, kapsam dışına erişemeyen anonim bir işlevdir.

Anonim bir fonksiyonu bu şekilde tanımladığınızda, o fonksiyon için bir “isim alanı” oluşturmuş olursunuz. Şu anda yalnızca bu isim alanına erişimi vardır.

$externalVariable = "Hello";
$secondExternalVariable = "Foo"; 
$myFunction = function() { 
  
  var_dump($externalVariable, $secondExternalVariable); // değişkenler tanımlanmadığı için iki hata bildirimi döndürür 

}

Herhangi bir harici değişkene erişimi yoktur. Bu isim alanının harici değişkenlere erişmesine izin vermek için, bunu closure’lar (use()) aracılığıyla tanıtmanız gerekir.

$myFunction = function() use($externalVariable, $secondExternalVariable) {
   var_dump($externalVariable, $secondExternalVariable); // Hello Foo
}

Bu durum büyük ölçüde PHP’nin sıkı değişken kapsamından kaynaklanmaktadır – Bir değişken kapsam içinde tanımlanmamışsa veya global ile getirilmemişse, o zaman mevcut değildir.

Ayrıca:

Değişkenleri üst kapsamdan devralmak, global değişkenleri kullanmakla aynı şey değildir. Global değişkenler, hangi fonksiyon çalıştırılırsa çalıştırılsın aynı olan global kapsamda bulunur.

Bir closure’ın ana kapsamı, closure’ın bildirildiği işlevdir (çağrıldığı işlev olması gerekmez).

PHP belgelerinden.


PHP’de closure’lar erken bağlama yaklaşımını kullanır. Bu, use anahtar sözcüğü kullanılarak closure’un isim alanına aktarılan değişkenlerin, closure tanımlandığında aynı değerlere sahip olacağı anlamına gelir.

Bu davranışı değiştirmek için değişkeni by-reference olarak geçirmelisiniz.

$rate = .05;

// Değişkeni closure'ın kapsamına aktarır
$calculateTax = function ($value) use ($rate) {
    return $value * $rate;
};

$rate = .1; 

print $calculateTax(100); // 5
$rate = .05;

// Değişkeni closure'ın kapsamına aktarır
$calculateTax = function ($value) use (&$rate) { // rate'den önceki & işaretine dikkat edin
    return $value * $rate;
};

$rate = .1;

print $calculateTax(100); // 10

Closure içeren/içermeyen anonim fonksiyonlar tanımlanırken varsayılan argümanlar dolaylı olarak gerekli değildir.

$message = 'Im yelling at you';

$yell = function() use($message) {
    echo strtoupper($message);
};

$yell(); // çıktı: IM YELLING AT YOU

Değişkenlere atama

Anonim işlevler, callback beklenen yerlerde parametre olarak kullanılmak üzere değişkenlere atanabilir:

$uppercase = function($data) {
    return strtoupper($data);
};

$mixedCase = ["Hello", "World"];
$uppercased = array_map($uppercase, $mixedCase);
print_r($uppercased);

Bu değişkenler bağımsız fonksiyon çağrıları olarak da kullanılabilir:

echo $uppercase("Hello world!"); // HELLO WORLD!

Fonksiyon olarak nesneler

class SomeClass {
    public function __invoke($param1, $param2) {
        // kod buraya
    }
}

$instance = new SomeClass();
$instance('First', 'Second'); // __invoke() metodunu çağır

Bir __invoke yöntemine sahip bir nesne aynen diğer işlevler gibi kullanılabilir.

__invoke yöntemi nesnenin tüm özelliklerine erişebilecek ve herhangi bir yöntemi çağırabilecektir.

Dış değişkenlerin kullanımı

use yapısı, değişkenleri anonim fonksiyonun kapsamına almak için kullanılır:

$divisor = 2332;
$myfunction = function($number) use ($divisor) {
    return $number / $divisor;
};

echo $myfunction(81620); //Çıktı 35

Değişkenler referans olarak da içe aktarılabilir:

$collection = [];

$additem = function($item) use (&$collection) {
    $collection[] = $item;
};

$additem(1);
$additem(2);

//$collection : [1,2]

Yerleşik işlevleri callback olarak kullanma

Bir argüman olarak callable alan işlevlerde, PHP yerleşik işlevi ile bir string de koyabilirsiniz. Dizideki tüm stringlerin başındaki ve sonundaki boşlukları kaldırmak için array_map parametresi olarak trim kullanmak yaygındır.

$arr = ['   one  ', 'two   ', '   three'];
var_dump(array_map('trim', $arr));

// array(3) {
//   [0] =>
//   string(3) "one"
//   [1] =>
//   string(3) "two"
//   [2] =>
//   string(5) "three"
// }

Anonim fonksiyon

Anonim fonksiyon, sadece adı olmayan bir fonksiyondur.

// Anonim fonksiyon
function() {
    return "Hello World!";
};

PHP’de anonim bir işlev bir ifade gibi ele alınır ve bu nedenle noktalı virgül ; ile sonlandırılmalıdır.

Anonim bir fonksiyon bir değişkene atanmalıdır.

// Bir değişkene atanan anonim işlev
$sayHello = function($name) {
    return "Hello $name!";
};

print $sayHello('John'); // Hello John

Ya da başka bir fonksiyonun parametresi olarak geçirilmelidir.

$users = [
    ['name' => 'Alice', 'age' => 20], 
    ['name' => 'Bobby', 'age' => 22], 
    ['name' => 'Carol', 'age' => 17]
];

// Anonim işlev uygulayan Map işlevi
$userName = array_map(function($user) {
    return $user['name'];
}, $users);

print_r($usersName); // ['Alice', 'Bobby', 'Carol']

Ya da başka bir işlevden döndürülmüş olabilir.

Kendi kendini çalıştıran anonim fonksiyonlar:

// PHP 7.x
(function () {
    echo "Hello world!";
})();

// PHP 5.x
call_user_func(function () {
    echo "Hello world!";
});

Kendi kendini çalıştıran anonim fonksiyonlara argüman geçirme:

// PHP 7.x
(function ($name) {
    echo "Hello $name!";
})('John');

// PHP 5.x
call_user_func(function ($name) {
    echo "Hello $name!";
}, 'John');

Saf fonksiyonlar

Saf fonksiyon, aynı girdi verildiğinde her zaman aynı çıktıyı döndüren ve yan etkisi olmayan bir fonksiyondur.

// Bir saf fonksiyon örneği
function add($a, $b) {
    return $a + $b;
}

Yan etkilerden kasıt; dosya sistemini değiştirmek, veritabanlarıyla etkileşim kurmak, hatta ekrana yazı yazdırmaktır.

// saf olmayan fonksiyon
function add($a, $b) {
    echo "Topluyoruz...";
    return $a + $b;
}

PHP’de sık kullanılan işlevsel yöntemler

Eşleme

Bir dizinin tüm elemanlarına bir fonksiyon uygulama :

array_map('strtoupper', $array);

Bunun, listede callback’in önce geldiği tek yöntem olduğunu unutmayın.

İndirgeme (veya katlama) – reduce

Bir diziyi tek bir değere indirgeme :

$sum = array_reduce($numbers, function ($carry, $number) {
   return $carry + $number;
});

Filtreleme

Geri çağırmanın yalnızca true döndürdüğü dizi öğelerini döndürür:

$onlyEven = array_filter($numbers, function ($number) {
    return ($number % 2) === 0;
});

Kapsam

PHP’deki anonim işlevlerin diğer PHP işlevleri gibi kendi kapsamı vardır.

JavaScript’te anonim bir işlev dış kapsamdaki bir değişkene erişebilir. Ancak PHP’de buna izin verilmez.

$name = 'John';

// Anonim fonksiyon kapsam dışına erişmeye çalışıyor
$sayHello = function() {
    return "Hello $name!";
}

print $sayHello('John'); // Hello !
// Bildirimler etkinken, bir de Tanımlanmamış değişken $name bildirimi vardır

Parametre olarak callback fonksiyonu geçirme

Kullanıcı tanımlı callback işlevlerini parametre olarak kabul eden birkaç PHP işlevi vardır, örneğin: call_user_func(), usort() ve array_map().

Kullanıcı tanımlı callback fonksiyonunun nerede tanımlandığına bağlı olarak, bunları aktarmanın farklı yolları olabilir:

Prosedürel tarz: 

function square($number)
{
    return $number * $number;
}

$initial_array = [1, 2, 3, 4, 5];
$final_array = array_map('square', $initial_array);
var_dump($final_array); // 1, 4, 9, 16, 25 içeren yeni diziyi yazdırır

Object Oriented stil: 

class SquareHolder
{
    function square($number)
    {
        return $number * $number;
    }
}

$squaredHolder = new SquareHolder();
$initial_array = [1, 2, 3, 4, 5];
$final_array = array_map([$squaredHolder, 'square'], $initial_array);

var_dump($final_array); // 1, 4, 9, 16, 25 içeren yeni diziyi yazdırır

Statik bir yöntem kullanarak Nesne Yönelimli stil: 

class StaticSquareHolder
{
    public static function square($number)
    {
        return $number * $number;
    }
}

$initial_array = [1, 2, 3, 4, 5];
$final_array = array_map(['StaticSquareHolder', 'square'], $initial_array);
// veya:
$final_array = array_map('StaticSquareHolder::square', $initial_array); //  PHP >= 5.2.3

var_dump($final_array); // 1, 4, 9, 16, 25 içeren yeni diziyi yazdırır

Bir yanıt yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top