foreach in case ..

vasilev

Registered
Здравейте,
правя rest api по логика:

Код:
switch ($_GET["p"]){
  case add: class::function().
...

опитвам се да вкарам динамично тези функции в array:

Код:
$arr=array(
    "add"=>Class1::add(),
    "read"=>Class2::read(),
);
switch ($_GET["p"]){
    foreach($arr as $k=>$v){
      case $k: ${v}; break;
    }
    default: echo "ok";
}

имате ли идеи как това да проработи :)
 
Код:
<?php
$x=array(
    0 => 'foo',
    1 => 'bar',
    2 => 'foobar'
);
$y = 'foo';
foreach ($x as $i) {
    switch($i){
        case $y:
            print 'Variable $x tripped switch: '.$i.'<br>';
            break;
    }
}

?>
 
това и аз го намерих само че идеята тук е друга.
имаш някакъв параметър и го взимаш с GET. правиш case този параметър - да вика друга static function.

искам да постигна нещо от сорта:

Код:
class foo{
    public static function bar(){
        echo "ok";
    }
}
class foo2{
    public static function bar2(){
        echo "ok2";
    }
}
class foo3{
    public static function bar3(){
        echo "ok3";
    }
}
$x=array(
    "foo" => foo::bar(),
    "foo2" => foo2::bar2(),
    "foo3" => foo3::bar3(),
);
$y = $_GET["page"];
foreach ($x as $k=>$i) {
    switch($k){
        case $y:
            $i;
            break;
    }
}
 
Хей така можеш да си го направиш - само трябва да сложиш класа и името на функцията като отделни елементи на списък за всеки ключ в $arr:

Код:
<?php
class Class1 { static function addMethod() { echo "Class1::add() called!\n"; } }
class Class2 { static function readMethod() { echo "Class2::read() called\n"; } }

$arr=array(
    "add" => [Class1::class, "addMethod"],
    "read"=> [Class2::class, "readMethod"],
);

$keys = ["add", "non-existing", "read"];

$key = $_GET['p'];

if(array_key_exists($key, $arr)) {
	call_user_func($arr[$key]);
} else {
	echo "default, nothing called";
}

Ето демо с няколко ключа, за да видиш как работи: https://www.ideone.com/8FGlSY

ПП. Оправих го да не хвърля предупреждения поради употребата на Class1 и Class2 "на голо".
 
<?php
class foo
{
public static function bar()
{
echo "ok";
}
}

class foo2
{
public static function bar2()
{
echo "ok2";
}
}

class foo3
{
public static function bar3()
{
echo "ok3";
}
}

$x = array(
"foo" => function () {foo::bar();},
"foo2" => function () {foo2::bar2();},
"foo3" => function () {foo3::bar3();}
);

$page = $_GET["page"];

if (isset($_GET['page'])) {
$page = $_GET['page'];
if(isset($x[$page])){
$x[$page]();
exit;
}
}
die('404 page not found');
 
Код:
<?php

class foo
{
    public static function bar()
    {
        echo "ok";
    }
}

class foo2
{
    public static function bar2()
    {
        echo "ok2";
    }
}

class foo3
{
    public static function bar3()
    {
        echo "ok3";
    }
}

$x = array(
    "foo" => function () {foo::bar();},
    "foo2" => function () {foo2::bar2();},
    "foo3" => function () {foo3::bar3();}
);

$page = $_GET["page"];

if (isset($_GET['page'])) {
    $page = $_GET['page'];
    if(isset($x[$page])){
        $x[$page]();
        exit;
    }
}
die('404 page not found');
 
Да.. И аз така тъкмо направих с key exist :)

Благодаря .. И двата отговора са ок !
 
стигнах до извода че това което искам да направя май не е толкова лесно :)
обеснявам:

Код:
$tst=array(
    "test"=>function () {foo1::bar1();},
    "test2"=>function () {foo2::bar2();},
);
class Foo{
    public static function bar(){
        global $tst;
        print_r($tst);
    }
}
Foo::bar();
array_push($tst,array("test3"=>function () {foo3::bar3();}));

имаме array с описание на други функции .
искам в някакъв момент да добавя нови записи в този array. въпросът е че всички php класове се зареждат автоматично без някаква подретба .
тоест аз няма как да окажа - първо array_push, след това да викна този foo:bar() който ще извика този array.
 
vasilev каза:
стигнах до извода че това което искам да направя май не е толкова лесно :)
обеснявам:

Код:
$tst=array(
    "test"=>function () {foo1::bar1();},
    "test2"=>function () {foo2::bar2();},
);
class Foo{
    public static function bar(){
        global $tst;
        print_r($tst);
    }
}
Foo::bar();
array_push($tst,array("test3"=>function () {foo3::bar3();}));

имаме array с описание на други функции .
искам в някакъв момент да добавя нови записи в този array. въпросът е че всички php класове се зареждат автоматично без някаква подретба .
тоест аз няма как да окажа - първо array_push, след това да викна този foo:bar() който ще извика този array.

По-лесно е да кажеш идеята си вместо да ни кажеш какъв метод се опитваш да имплементираш. След този global дето използва в класа се съмнявам да си в права посока.
 
vasilev каза:
искам в някакъв момент да добавя нови записи в този array. въпросът е че всички php класове се зареждат автоматично без някаква подретба .
тоест аз няма как да окажа - първо array_push, след това да викна този foo:bar() който ще извика този array.

Тази част и аз не я разбрах, може ли пак :think:
 
Имам rest api и използвам статични функции.
Главният class е от вида Class_api {} . В него има n на брой функции.
Искам да добавя нови .. в зависимост дали тези новите са създадени.
Веки клас е в дадена папка. Ако тази папка я няма - не се зарежда.
В момента имам /api, /api2, /api3 ... , имената на класовете са Class_api, Class_api2 ..И тн.
Искам да има само един главен клас .. за /api .
Така съм го направил преди . Зареждаш страница /test и търси Class_test. Ако няма такъв -> page not found.
 
Искам да има само един главен клас .. за /api .

А как ще разбереш кой клас ти трябва точно? Искаш от /api/method да викаш method от Class_api ли?
 
А защо вместо да ползваш тая глупост не се огледаш за нещо със готова структура, някой фреймурк?
Lumen примерно
 
Djman - викам статична функция в зависимост от /merhod
Пример:

Switch method
Case test: class_api::test()
Case test2 ... И тн

Uphero , защото съм направил вече framework .. не искам да ползвам нов :)
 
vasilev каза:
Uphero , защото съм направил вече framework .. не искам да ползвам нов :)

Ами използвай готови компоненти, като например тези на Symfony и ги интегрирай. Губиш си времето с нещо, което е направено в пъти по-добре.

П.П. Времето, в което беше яко да си пишем собствени рамки отдавна мина и винаги ще ти липсва нещо, което вече е направено.
 

Горе