Jimmay
Jimmay

Reputation: 1009

Pass class function as callback

I am trying to do something like this:

<?php

class item {
    public $available;
    public $name;

    public function isAvailable() {
        return $this->available;
    }
}

$items = array(new item(), new item(), new item());

function getAvailableItems() {
    return array_filter($GLOBALS['items'], $this.isAvailable);
}

$items[0]->available = false;
$items[0]->name = "x";

$items[1]->available = true;
$items[1]->name = "y";

$items[2]->available = true;
$items[2]->name = "z";

print("First available item " . reset(getAvailableItems())->name);

?>

But I am not sure of the correct syntax on line 15. I am using PHP 5.5.8.

I have been advised to do this:

return array_filter($GLOBALS['items'], array($this, 'isAvailable'));

But this doesn't work either:

<b>Warning</b>:  array_filter() expects parameter 2 to be a valid callback, first array member is not a valid class name or object on line <b>15</b><br />
<br />
<b>Warning</b>:  reset() expects parameter 1 to be array, null given on line <b>27</b><br />

First available item

class item {
    public static $available;
    public $name;

    public static function isAvailable() {
        return self::$available;
    }
}

$items = array(new item(), new item(), new item());

function getAvailableItems() {
    return array_filter($GLOBALS['items'], item::isAvailable());
}

$items[0]->available = false;
$items[0]->name = "x";

$items[1]->available = true;
$items[1]->name = "y";

$items[2]->available = true;
$items[2]->name = "z";

print("First available item " . reset(getAvailableItems())->name);

Also gives same warnings.

The best thing I've been able to do so far is this:

//<?php

class item {
    public $available;
    public $name;
}

$items = array(new item(), new item(), new item());

function getAvailableItems() {
    return array_filter($GLOBALS['items'], function($item) {
        return $item->available;
    });
}

$items[0]->available = false;
$items[0]->name = "x";

$items[1]->available = true;
$items[1]->name = "y";

$items[2]->available = true;
$items[2]->name = "z";

print("First available item " . reset(getAvailableItems())->name);

//?>

As an anonymous function it works, but is there no way to pass a class function?

Upvotes: 0

Views: 99

Answers (1)

Mudaser Ali
Mudaser Ali

Reputation: 4309

If you see the array_filter in callback php passes each value of the array in the callback function; so one of the possible solution is as follow:-

<?php

class item {
    public $available;
    public $name;

    public function isAvailable() {
        return $this->available;
    }
}

$items = array(new item(), new item(), new item());

function getAvailableItems() {
    return array_filter($GLOBALS['items'], 'filterItems');
}

function filterItems(item $item) {
    return $item->available;
}

$items[0]->available = false;
$items[0]->name = "x";

$items[1]->available = true;
$items[1]->name = "y";

$items[2]->available = true;
$items[2]->name = "z";

print("First available item " . reset(getAvailableItems())->name); // First available item y

Upvotes: 1

Related Questions