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:

<?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:

<?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:

<?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:

$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

GtkOrientation::VERTICAL
GtkOrientation::HORIZONTAL

Quando trabalharmos com namespace, qual seria mais conveniente:

Manter da forma como está

\GtkOrientation::VERTICAL
\GtkOrientation::HORIZONTAL

Adicionar tudo dentro do Gtk

\Gtk::ORIENTATION_VERTICAL
\Gtk::ORIENTATION_HORIZONTAL

Manter uma unica constante

\GTK_ORIENTATION_VERTICAL
\GTK_ORIENTATION_HORIZONTAL

Ou criar classes separadas como o PSR dita

\Gtk\Orientation::VERTICAL
\Gtk\Orientation::HORIZONTAL

Responde lá, você faz parte disso

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