wz

PHP: Problém při volání https z localhostu

02:27 07.06.2016

Tento problém obsahuje bez většího vysvětlování rychlo-poznámky k problému, který jsem řešil na vývojovém počítači (až to budu zase jednou řešit :) ) - z PHP scriptu jsem zkoušel pomocí curl funkcí dotazovat https adresu.

PHP 5.5: příklad na yield

19:45 23.05.2016

PHP 5.5 přišlo s operátorem yield. Níže je uvedený jeden příklad na jeho použití:

$a = [ 0 , 1 , 2 , 3, 4 ];

function square($a){
  foreach($a as $row){
    yield $row.'^2 = '.$row*$row;
  }
}

foreach(square($a) as $value){
  echo $value.'<br>'; 
}

Výsledek tohoto příkladu:

0^2 = 0
1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16

Další (více vysvětlovací) příklad je k nalezení např. zde.

PHP 5.4: Alternativní zápis vytvoření pole

19:40 23.05.2016

PHP 5.4 přišlo s novou možností, jak vytvořit pole. Viz. příklad níže, kde jsem použil jak starší způsob (array), tak i novější způsob ( [] ):

$a = ['a','b','c'];
print_r($a);

print '<br><br>';

$b = array('d','e','f');
print_r($b);

print '<br><br>';

$c = ['first' => 'g', 'second' => 'h', 'i'];
print_r($c);

print '<br><br>';

Výsledek příkladu:

Array ( [0] => a [1] => b [2] => c ) 

Array ( [0] => d [1] => e [2] => f ) 

Array ( [first] => g [second] => h [0] => i ) 

Spuštění PHP kódu nad různými verzemi PHP online

20:31 08.06.2015

Na stránce http://3v4l.org/ je možné v editůrku napsat PHP kód a nechat si ho spustit nad různými verzemi PHP. K dispozici je po vyhodnocení i několik statistik.

PHP: Jaké má třída metody

23:11 03.02.2015

Mějme v PHP třídu a chtějme si vypsat její metody. Posloužit k tomu může ReflectionClass. Malý příklad:

class A{
  public static function get1(){
    return '1';
  }
  
  public function get2(){
	  return '2';
  }
  
  private function get3(){
	  return '3';
  }
}

$reflectionClass = new ReflectionClass('A');

print_r($reflectionClass->getMethods());

Print_r vypíše:

Array ( 
[0] => ReflectionMethod Object ( [name] => get1 [class] => A ) 
[1] => ReflectionMethod Object ( [name] => get2 [class] => A ) 
[2] => ReflectionMethod Object ( [name] => get3 [class] => A ) 
)

PHP 5.3 End Of Life

22:33 21.08.2014

Vyšla poslední verze PHP 5.3. Konkrétně PHP 5.3.29. PHP 5.3 je nyní EOL. Více zde.

PHP: Chování při nešťastné práci s referencemi

00:09 19.08.2014

Mějme tento script:

$pole = array(
  0 => array( 'a' => 1, 'b' =>2,'key' => 'prvni'),
  1 => array( 'a' => 3, 'b' =>4,'key' => 'druhy'),
  2 => array('a' => 5, 'b' =>6,'key' => 'treti') 
);

$presKlic = array();
$postupne = array();

foreach($pole as $p){
  $presKlic[$p['key']] = &$p;
  $postupne[] = &$p;
}

print 'presKlic: ';print_r($presKlic);
print '<br>';
print 'postupne: ';print_r($postupne);

Výsledek je následující, což by mohlo někoho překvapit (kopíroval jsem pod-pole pole do jiných polí, a ve výsledku se do nových polí 3x zduplikovalo stejné pod-pole):

presKlic: Array ( [prvni] => Array ( [a] => 5 [b] => 6 [key] => treti ) [druhy] => Array ( [a] => 5 [b] => 6 [key] => treti ) [treti] => Array ( [a] => 5 [b] => 6 [key] => treti ) ) 

postupne: Array ( [0] => Array ( [a] => 5 [b] => 6 [key] => treti ) [1] => Array ( [a] => 5 [b] => 6 [key] => treti ) [2] => Array ( [a] => 5 [b] => 6 [key] => treti ) )

Kdybych např. na konci cyklu přidal unset($p), tak by tento problém nenastal a zkopírovaly by se všechny pod-pole. Nebo jsem mohl & použít už ve foreach - měl bych tam tedy foreach($pole as &$p) .

PHPUnit 4.1: Stažení a test funkčnosti

01:00 08.07.2014

Po čase jsem se dostal zase z PHPUnit. Rozchodit ho před pár lety ve Windows mi vzalo docela dost času, ale možná jsem byl jen natvrdlej :) Pak jsem přešel na jiný počítač a nainstalovat jsem se ho znova rozhodl až nyní. Související web je http://phpunit.de/.

PHPUnit tu byl ke stažení jako .phar balík, což bylo milé zjištění. Phar soubor stačilo stáhnout a člověk měl vše potřebné v počítači.

Pro test funkčnosti jsem si vytvořil třídu a k ní odpovídající test. Pro jednoduchost ve stejném adresáři.

Monitor.php:


class Monitor{
  private $color;
  private static $numberOfMonitors=0;

  public function __construct(){
    self::$numberOfMonitors++;
  }
  
  public function setColor($color){
    $this->color = $color;
  }
  
  public function getColor(){
    return $this->color;
  }
  
  public static function getNumberForMonitors(){
    return self::$numberOfMonitors;
  }
}

Monitor_test.php:

require_once 'Monitor.php';

class Monitor_Test extends PHPUnit_Framework_TestCase{
   
   public function testCreation(){
      $before = Monitor::getNumberForMonitors();
      $monitor = new Monitor();
      $after = Monitor::getNumberForMonitors();
      $this->assertTrue($before + 1 == $after);
      $this->assertTrue($monitor->getColor() === null);
      $this->assertFalse($monitor->getColor() === null);
   }
   
}

Spustit test se pak podařilo např. takto: V příkazové řádce jsem zadal následující:

CESTA_K_PHP_EXE CESTA_K_PHAR_SOUBORU CESTA_K_MONITOR_TEST.PHP

Tedy např.:

php C:\phpunit\phpunit.phar C:\phpunit\monitor\Monitor_test.php

Výsledkem bylo pár hlášek. Mezi nimi i "Tests: 1, Assertions: 3, Failures: 1.". To jako test funkčnosti (že to jako vůbec něco dělá :-) ) stačilo. Dalším cílem bylo udělat testy "hezčeji". O tom ale třeba v nějakém dalším příspěvku.

PHP: Instalace ZeroMQ extension ve Windows

18:03 04.05.2014

Potřeboval jsem si na PHP ve Windows přidat extension pro zeromq (zmq). Toto jsou kroky, které vedly k cíli:

  • stáhnout pecl balíček: http://windows.php.net/downloads/pecl/releases/zmq/1.1.2/ - stáhnul jsem ten pro své php
  • php_zmq.dll vloženo do \php\ext (adresář, kde to dle nastavení hledá extensions)
  • libzmq.dll vloženo do \php
  • zaregistrováno v php.ini pomocí extension=php_zmq.dll
  • restartovat apache
  • zkontrolováno v error.log, že to nepíše chybovou hlášku
  • přes phpinfo() ověřeno, že tam je zmq

PHP: Integer zapsaný binárně

23:47 21.04.2014

Od PHP 5.4 lze vytvářet celočíselné proměnné i pomocí binárního zápisu.

A tak zatímco např. v PHP 5.3 zápis $a=0b111; vyhodí "Parse error: syntax error, unexpected T_STRING", tak v PHP 5.4 print 0b111; vypíše číslo 7.

Celá čísla lze samozřejmě zapisovat i jinak. Více viz. PHP manual.