Znalosti
Známky jako ve škole:
- PHP - 2
-
PHP frameworky
- Nette - 2
-
ORM
- Doctrine ORM - 2
- Nextras ORM - 2
-
DB
- MySQL - 3
- GIT - 2
- Elastic search - 3
- Rabbit MQ - 3
- Docker - 3
- JavaScript - 3
Nástroje
- IDE - PhpStorm
- OS - MacOs
Podmínka
<?php
if ($falsy = true and false) {
print "Nepravda\n";
} else {
print "Pravda pravdoucí\n";
}Kód vypíše Pravda pravdoucí. Výsledek mě nijak nepřekvapil.
Vysvětlení: Návratová hodnota přiřazení do proměnné je přiřazovaná hodnota. Tzn. výsledkem $falsy = true je true. Podmínka následně hodnotí true and false, jde o logický součin, kde je výsledkem true pouze v případě, že je na všech vstupech hodnota true. Zde je tedy výsledkem false - program proto pokračuje dle větve else.
Třídění a test
<?php
class ArraySorting
{
private array $array;
public function __construct()
{
$this->array = [
'0' => 'ahoj1',
'1' => 'Ahoj10',
'2' => 'ahoj12',
'3' => 'Ahoj2',
'4' => 'ahoj3',
];
}
public function getSortedArray(): array
{
uasort($this->array, function (string $a, string $b) {
preg_match('!\d+!', $a, $aMatches);
preg_match('!\d+!', $b, $bMatches);
if (isset($aMatches[0]) and isset($bMatches[0])) {
return $aMatches[0] - $bMatches[0];
} else {
return isset($aMatches[0]) ? 1 : -1;
}
});
return $this->array;
}
}<?php
class ArraySortingTest extends PHPUnit_Framework_TestCase
{
public function testArraySorting()
{
$a = new ArraySorting();
$array = $a->getSortedArray();
$arrayKeys = array_keys($array);
$this->assertIsArray($array);
$this->assertEquals(5, count($array));
$this->assertEquals('ahoj1', array_shift($array));
$this->assertEquals(0, array_shift($arrayKeys));
$this->assertEquals('Ahoj2', array_shift($array));
$this->assertEquals(3, array_shift($arrayKeys));
$this->assertEquals('ahoj3', array_shift($array));
$this->assertEquals(4, array_shift($arrayKeys));
$this->assertEquals('Ahoj10', array_shift($array));
$this->assertEquals(1, array_shift($arrayKeys));
$this->assertEquals('ahoj12', array_shift($array));
$this->assertEquals(2, array_shift($arrayKeys));
}
}Magic
Pokud ze zadání správně chápu vně objektu jako mimo definici dané třídy, a předpokládám, že v proměnné $product je uložena instance této třídy. V případě, že vlastnost price je protected, tak k ní přistupovat nemohu, to způsobí Fatal error. K vlastnosti, která je protected mohu přistoupit jen uvnitř definice dané třídy, nebo uvnitř třídy, které od dané třídy extenduje a to pomocí $this->price.
V případě že vlastnost price není definována vůbec, tak k ní sice přistoupit mohu, ale dostanu Notice, že vlastnost není definovaná. Vlastnost bude mít hodnotu NULL. Mohl bych samozřejmě pomocí např. $product->price = 100; tuto vlastnost nastavit, ale obecně toto dle mého názoru rozhodně není správný způsob práce s objekty.
Debug
Při práci v Nette jsem si zatím vždy vystačil s Nette Tracy.
Kód
Jak už to tak asi bývá, tak dobrý kód z práce sdílet nemůžu a na hobby projekty nikdy není dostatek času. Co bych mohl ukázat je kód webu https://dawebcb.skosacek.cz/, který jsem nedávno dělal za účelem sdílení výsledků cvičení z JavaScriptu pro Czechitas Digitální akademii. Kód jsem zveřejnil na githubu: https://github.com/stanislavKosacek/daweb-minimal.
Spousta věcí v projektu není dotažená, jelikož jsme se nakonec rozhodli je nepoužívat a web používáme prakticky pouze na sdílení řešení zadaných cvičení. Z programátorského hlediska je v projektu asi zajímavá tato část: https://github.com/stanislavKosacek/daweb-minimal/tree/main/app/Model/Page/PageBlock/Types. Jde o návrhový vzor Strategy, kde všechny typy bloku implementují stejný Interface a každý typ bloku má svou vlastní komponentu pro administraci a frontend. Jelikož mají všechny typy bloku jednotou signaturu, tak mohou být uloženy v jedné databázové tabulce a třída PageBlockRepository po načtení z databáze rovnou vytváří dle typu bloku jeho konkrétní instanci.
Praktická
Nepodařilo se mi podle zadání projekt zprovoznit na poslední stabilní verzi PHP (8.0.3). Phalcon zatím nemá podporu pro PHP 8. Kód projektu je na githubu: https://github.com/stanislavKosacek/phalcon-btc, výsledek na adrese: https://btc.skosacek.cz