If you need to write PHP command line scripts and you need to print some errors on STDERR you can use the following code.

, ,

If you recently upgraded PHP to version 5.3.0 or higher, you have probably encountered a message like this:

Deprecated: Call-time pass-by-reference has been deprecated in filename.php

Use & when you call a function foo(&$var) generates the warning message.

Remember that in 5.3 version of PHP only Call-time pass by reference is deprecated but not Passing by reference.

See the example below:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// normal passing by reference
function functionA(&$var) {
    $var++;
}
 
// call-time passing by reference
function functionB($var)
{
    $var++;
}
 
// correct call
functionA($var);
 
// deprecated
functionB(&$var);

If you can’t edit existing code, for example, third-party software, you can use these work-arounds:

  1. Turn off error messages: is always a good idea hide any type of error message in a production site. You can use error_reporting(0) function or if you want you can use the @ symbol before any statement. This is not a good solution of this problem.
  2. Allow call-time pass-by-reference in your php.ini file: in your php.ini file you can set allow_call_time_pass_reference = on but this is a temporary solution only until the next version.

Resources:

, ,

Often we need to operate with objects that sometimes we have to use as an array.
For example we can get an attribute from an object:

$attr = $myObject->attr;

or by array access from the same object

$attr = $myObject['attr'];

We can set data simply like an array or directly.

, ,

La gestione di un menu e delle relative pagine è molto semplice grazie alla classe Zend Navigation.
Il manuale di Zend Framework spiega molto bene come utilizzare questo componente. In breve il principio di funzionamento consiste nel creare oggetti pagina (Zend_Navigation_Page) che a loro volta possono contenere altre pagine. Questa struttura dati verrà poi data in pasto alla classe Zend_Navigation che si occuperà di mettere a disposizione tutti i metodi necessari per la gestione del menu.

Possiamo creare un metodo privato all’interno del nostro Bootstrap per inizializzare il menu e renderlo disponibile agli helper nella view.

protected function _initNavigation()
    {
        $this->bootstrap('layout');
        $layout = $this->getResource('layout');
        $view = $layout->getView();
 
        // create pages
        $pages = array(
                array(
                        'label'         => 'Home',
                        'module'        => 'default',
                        'controller'    => 'index',
                        'action'        => 'index',
                        'order'         => -100 // first page
                ),
                array(
                        'label'         => 'Posts',
                        'module'        => 'default',
                        'controller'    => 'posts',
                        'action'        => 'index',
                        'visible'       => true,
                        'pages'         => array(
                                array(
                                        'label'         => 'Add',
                                        'module'        => 'default',
                                        'controller'    => 'posts',
                                        'action'        => 'add'
                                )
                        )
                ),
                array(
                        'label'      => 'Administration',
                        'module'     => 'admin',
                        'controller' => 'index',
                        'action'     => 'index',
                        'resource'   => 'mvc:admin', // resource
                )
        );
 
        // create container from array
        $navigation = new Zend_Navigation($pages);
        Zend_Registry::set('Zend_Navigation', $navigation);
        $view->navigation($navigation);
    }
, ,

WP-Syntax è il plugin che utilizzo per evidenziare i codici che inserisco nei miei post. Da subito ho notato un problema che deriva dall’editor integrato di WordPress. Infatti al momento dell’inserimento del codice all’interno dei tag <pre></pre> tra il passaggio da modalità “Visuale” o “HTML” i caratteri speciali vengono convertiti in entità HTML, come per esempio i carattetri <> vengono tradotti in &lt; &gt;

Cercando velocemente su Internet ho subito trovato una soluzione immediata, ovvero un workaround che utilizza la funzione htmlspecialchars_decode di PHP.
Modificando una riga del file wp-syntax.php si risolve il problema.

    //$geshi = new GeSHi($code, $language);
    $geshi = new GeSHi(htmlspecialchars_decode($code), $language);

Nota: la funzione htmlspecialchars_decode è disponibile solo per le versioni di PHP superiori o uguali alla 5.1.0. Per le versioni precedenti è possibile simularla in questo modo:

if (!function_exists("htmlspecialchars_decode")) {
    function htmlspecialchars_decode($string, $quote_style = ENT_COMPAT) {
        return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
    }
}

Fonte: http://blog.felho.hu/escaping-problem-with-wp-syntax-wordpress-plugin.html

, , , ,

Come sappiamo le coordinate geografiche (latitudine e longitudine) sono espresse in gradi, minuti e secondi. Spesso capita di dover trattare questi dati in formato decimale ed è quindi utile poter convertire i decimali in gradi e viceversa.

Ecco due semplici funzioni PHP che servono a questo scopo:

    function dmsToDec($deg, $min, $sec)
    {
        return $deg + ((($min*60) + ($sec)) / 3600);
    }
 
    function decToDms($dec)
    {
        $dec = abs($dec);
        $d = (int) $dec;
        $m = (int) (($dec - $d) * 60);
        $s = ($dec - $d - ($m / 60)) * 3600;
        $s = round($s, 1);
 
        $array = array("deg" =&gt; $d, "min" =&gt; $m, "sec" =&gt; $s);
 
        return $array;
    }

Se inoltre vogliamo ottenere la stringa che rappresenta i gradi possiamo usare questa funzione che prende in ingresso il valore decimale ($dec) e una stringa ($latlng) che assume i valori ‘lat’ o ‘lng’ nel caso in cui si voglia convertire rispettivamente una latitudine o una longitudine.

    function decToDmsString($dec, $latlng)
    {
        if (! $dec) {
            return "-";
        }
        if ($latlng == 'lat') {
            $card = ($dec &gt; 0) ? 'N' : 'S';
        } elseif($latlng == 'lng') {
            $card = ($dec &gt; 0) ? 'E' : 'W';
        } else {
            throw new Exception('$latlng is not valid, use "lat" or "lng"');
        }
 
        $array = self::decToDms($dec);
        $deg = $array['deg'] . '°';
        $min = $array['min'] . '\'';
        $sec = $array['sec'] . '\'\'';
 
        $string = $card . ' ' . $deg . ' ' . $min . ' ' . $sec;
 
        return $string;
    }
, , , ,