Com o PHP 7, a linguagem já deu um salto incrível em recursos, e fortaleceu mais ainda a ideia de se ter padrões, como o PSR. Esses padrões devem estar em conformidade, não todo, ele mesmo diz isso, mas deve se ter o conhecimento destes padrões, para um desenvolvimento limpo e claro para futuras manutenções. Dito isso, como fica o PHP-GTK 3?

Dia 04 de Julho deste ano foi feita uma pesquisa no Twitter, com 226 votos, dando o resultado do uso do Gtk como uma namespace. Assim, conseguiremos atingir um patar de outras linguagens para desktop. Imagine a situação:

1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
18
19
2021
22
23
24
2526
27
28
29
3031
32
33
34
3536
37
38
39
4041
42
43
44
4546
47
48
49
5051
52
53
54
5556
57
58
59
6061
62
63
64
6566
67
68
69
7071
72
<?php
 
// Create a css provider
$css_provider = new GtkCssProvider();
$ret = $css_provider->load_from_data("    stackswitcher button {
        border-radius: 0;
        background: #ffffff;
        border: none;
        border-bottom: 1px #dfdfdf solid;        padding: 10px 0;
    }
 
    stackswitcher button:checked  {
        background: #DADBFF;    }
 
    stackswitcher button:focus  {
        border: none;
        outline: none;    }
 
    scrollbar,
    scrollbar * {
        min-width: 8px;        min-height: 8px;
        padding: 0;
        margin: 0;
        border: 0;
        border-radius: 0;    }
 
    scrollbar slider {
        background: #B3B5E0;
    }");
if(!$ret) {
    die("Css Error\n");
}
 $style = new GtkStyleContext();
$style->add_provider_for_screen($css_provider, 600);
 
// 
$win = new GtkWindow(); 
$switcher = new GtkStackSwitcher();
 
$scroll = new GtkScrolledWindow();
$scroll->add($switcher);$scroll->set_policy(GtkPolicyType::AUTOMATIC, GtkPolicyType::AUTOMATIC);
 
$stack = new GtkStack();
$switcher->set_stack($stack);
$switcher->set_can_focus(FALSE);$switcher->set_can_default(FALSE);
$switcher->set_orientation(GtkOrientation::VERTICAL);
 
$paned = new GtkPaned(GtkOrientation::HORIZONTAL);
$paned->add1($scroll);$paned->add2($stack);
 
$stack->add_titled(new GtkLabel("teste1"), "teste1", "teste1");
 
$win->add($paned); 
$win->connect("destroy", ["Gtk", "main_quit"]);
$win->set_size_request(800, 500);
$win->show_all();
$paned->set_position(240);Gtk::main();
 

Complexo compreender tudo isso né? Claro que você pode pensar que não, que é simples entender, mas isso pode ocorrer por que talvez você já esteja habituado com o código, ou você consegue prestar mais atenção nos detalhes.

Dai entra o namespace.

Neste mesmo exemplo, poderíamos dividir as tarefas, de forma que tudo fique organizado dentro do mesmo namespace. Poderiamos trabalhar da forma como está, algo assim:

1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
18
19
2021
22
23
24
2526
27
28
29
30
<?php
 
namespace myapp;
 
// $win = new \GtkWindow();
 
$switcher = new \GtkStackSwitcher();
 
$scroll = new \GtkScrolledWindow();$scroll->add($switcher);
 
$stack = new \GtkStack();
$switcher->set_stack($stack);
 $paned = new \GtkPaned(\GtkOrientation::HORIZONTAL);
$paned->add1($scroll);
$paned->add2($stack);
 
$stack->add_titled(new GtkLabel("teste1"), "teste1", "teste1"); 
$win->add($paned);
 
$win->connect("destroy", ["Gtk", "main_quit"]);
$win->set_size_request(800, 500);$win->show_all();
$paned->set_position(240);
 
\Gtk::main();
 

Mas isso não faz parte do conceito de namespaces. Então ficou definida na pesquisa que trabalharemos algo assim:

1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
18
19
2021
22
23
24
2526
27
28
29
30
<?php
 
namespace myapp;
 
// $win = new \Gtk\Window();
 
$switcher = new \Gtk\StackSwitcher();
 
$scroll = new \Gtk\ScrolledWindow();$scroll->add($switcher);
 
$stack = new \Gtk\Stack();
$switcher->set_stack($stack);
 $paned = new \Gtk\Paned(\GtkOrientation::HORIZONTAL);
$paned->add1($scroll);
$paned->add2($stack);
 
$stack->add_titled(new \Gtk\Label("teste1"), "teste1", "teste1"); 
$win->add($paned);
 
$win->connect("destroy", ["Gtk", "main_quit"]);
$win->set_size_request(800, 500);$win->show_all();
$paned->set_position(240);
 
\Gtk::main();
 

Notou como a organização é limpa? Window do namespace Gtk. Isso abre porta para novas libs como Fabula, que poderia trabalhar sem nenhum conflito:

1
2
$win = new \Fabula\Window();
 

A duvida agora é com relação às constantes. No PHP-GTK 1 e 2, as constantes ficavam todas referenciadas na classe Gtk e Gdk. Já o PHP-GTK 3 foi escrito o mais proximo do GTK++, fazendo com que as contanstantes estejam dentro de suas proprias estruturas, como por exemplo GtkOrientation

1
2
GtkOrientation::VERTICAL
GtkOrientation::HORIZONTAL

Quando trabalharmos com namespace, qual seria mais conveniente:

Manter da forma como está

1
2
\GtkOrientation::VERTICAL
\GtkOrientation::HORIZONTAL

Adicionar tudo dentro do Gtk

1
2
\Gtk::ORIENTATION_VERTICAL
\Gtk::ORIENTATION_HORIZONTAL

Manter uma unica constante

1
2
\GTK_ORIENTATION_VERTICAL
\GTK_ORIENTATION_HORIZONTAL

Ou criar classes separadas como o PSR dita

1
2
\Gtk\Orientation::VERTICAL
\Gtk\Orientation::HORIZONTAL

Responde lá, você faz parte disso

https://twitter.com/ScornInPC/status/1151946275924979713