- Add reference to PCRE POSIX functionality
- Get updated mock exams to students
For Thu 04 Aug 2022
- Review quiz questions for Topic 8 (course module 9) (Database)
- Review quiz questions for Topic 9 (course module 10) (Security)
- Review quiz questions for Topic 10 (course module 11) (Web Features)
- Review quiz questions for Topic 11 (course module 12) (Error Handling) Final Mock Exam For Thu 28 Jul 2022
- Second Mock Exam
- Review quiz questions for Topic 6 (course module 7) (Functions)
- Review quiz questions for Topic 7 (course module 8) (OOP) For Thu 21 Jul 2022
- Review quiz questions for Topic 4 (course module 5) (Arrays)
- Review quiz questions for Topic 5 (course module 6) (I/O)
- First Mock Exam For Tues 19 Jul 2022
- Review quiz questions for Topic 1 (course module 2) (Basics)
- Review quiz questions for Topic 2 (course module 3) (Data Formats and Types)
- Review quiz questions for Topic 3 (course module 4) (Strings and Patterns)
- Download the ZIP file from the URL given by the instructor
- Unzip into a new folder
/path/to/zip
- Follow the setup instructions in
/path/to/zip/README.md
What is considered "empty"?
- https://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting Overview of topics: https://www.zend.com/training/php-certification-exam Good overview of typical PHP program operation:
- https://www.zend.com/blog/exploring-new-php-jit-compiler Constants
<?php
namespace abc {
define('WHATEVER', 'Whatever', TRUE);
const ANYTHING = 'Anything';
}
namespace xyz {
echo WHATEVER;
echo ANYTHING;
}
Tutorial oriented towards the exam:
<?php
echo "Logical AND\n";
printf("%04b\n", 0b00 & 0b00);
printf("%04b\n", 0b00 & 0b01);
printf("%04b\n", 0b01 & 0b00);
printf("%04b\n", 0b01 & 0b01);
echo "Logical OR\n";
printf("%04b\n", 0b00 | 0b00);
printf("%04b\n", 0b00 | 0b01);
printf("%04b\n", 0b01 | 0b00);
printf("%04b\n", 0b01 | 0b01);
echo "Logical XOR\n";
printf("%04b\n", 0b00 ^ 0b00);
printf("%04b\n", 0b00 ^ 0b01);
printf("%04b\n", 0b01 ^ 0b00);
printf("%04b\n", 0b01 ^ 0b01);
Examples of the three ops:
<?php
$a = 0b11111111;
$b = 0b11011101;
printf("%08b", $a & $b); // 1101 1101
printf("%08b", $a | $b); // 1111 1111
printf("%08b", $a ^ $b); // 0010 0010
Left/right shift illustration:
<?php
echo 16 << 3;
echo "\n";
echo 0b10000000;
echo "\n";
echo 16 >> 3;
echo "\n";
echo 0b00000010;
echo "\n";
echo 15 >> 3;
echo "\n";
echo 0b00000001;
echo "\n";
Nested Ternary Construct
$a = 30;
$b = 20;
echo ($a < $b) ? 'Less' : (($a == $b) ? 'Equal' : 'Greater');
// output: "Greater"
Null coalesce operator example
$token = $_GET['token'] ?? $_POST['token'] ?? $_COOKIE['token'] ?? 'DEFAULT';
php.ini
file settings:
- https://www.php.net/manual/en/ini.list.php Extensions
- These are in the core:
- https://github.com/php/php-src/tree/PHP-7.1.30/ext
- but not all are enabled by default
- You're only tested on the extensions enabled by default
- Study up on
gc_collect_cycles()
Have a look at this article: https://www.php.net/manual/en/features.gc.performance-considerations.php
Read up on SimpleXMLElement
- https://www.php.net/manual/en/simplexml.examples-basic.php
- XPath Tutorial: https://www.w3schools.com/xml/xpath_intro.asp
DateTime
examples
<?php
// for relative formats see:
// https://www.php.net/manual/en/datetime.formats.relative.php
$date[] = new DateTime('third thursday of next month');
$date[] = new DateTime('now', new DateTimeZone('CET'));
$date[] = new DateTime('@' . time());
$date[] = (new DateTime())->add(new DateInterval('P3D'));
var_dump($date);
- Don't forget that to run a SOAP request, you can also use:
SoapClient::__soapCall()
SoapClient::__doRequest()
- Study on
DateTimeInterval
andDateTimeZone
and also "relative" time formats - In addition, be aware of the basic time format codes
- Pay close attention to
strftime()
- Example of a soap client:
- PayPal has a SOAP API that is publically accessible
- REST vs. SOAP:
- Study the docs on
sprintf()
to get format codes for that family of functions - Example using negative offsets:
<?php
$dir = '/home/doug/some/directory/';
if (substr($dir, 0, 1) === '/') echo 'Leading slash' . PHP_EOL;
if (substr($dir, -1) === '/') echo 'Trailing slash' . PHP_EOL;
if ($dir[-1] === '/') echo 'Trailing slash' . PHP_EOL;
- Tutorial on PHP regex: https://www.w3schools.com/php/php_regex.asp
- Using regex to swap sub-patterns
<?php
$text = 'Doug Bierer';
$patt = '/(.*)\s(.*)/';
echo preg_replace($patt, '$2, $1', $text);
preg_replace()
andpreg_match()
example using sub-patterns:
<?php
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$2 $1 $3';
echo preg_replace($pattern, $replacement, $string);
preg_match($pattern, $string, $matches);
var_dump($matches);
For iterating through an array beginning-to-end don't forget about these functions:
array_walk()
array_walk_recursive()
array_map()
Also: please don't forget the array navigation functions:reset()
: sets pointer to topend()
: sets pointer to endprev()
: advances array pointernext()
: un-advances array pointerkey()
: returns index value at array pointercurrent()
: returns value of element at array pointer
Streams
- Don't have to study all functions, just certain of the more common ones
- https://www.php.net/streams
stream_context_create()
stream_wrapper_register()
stream_filter_register()
stream_filter_append()
stream_socket_client()
In addition to the informational file functions mentioned, you also have:
fileatime()
filemtime()
filectime()
etc.
- Read up on
Closure::bindTo()
- Read up on magic methods!
- https://www.php.net/manual/en/language.oop5.magic.php
- Don't worry about any methods added after PHP 7.1
__destruct()
called when object goes out-of-scope- End of program
unset()
- Called in a function and function call ends
- Overwritten
- Late static binding
- Serialization example:
<?php
class Test
{
public $a = 0;
public $b = 0;
public $c = 'Test';
public $d = [];
public $e = '';
public function __construct(int $a, float $b, string $c, array $d)
{
$this->a = $a;
$this->b = $b;
$this->c = $c;
$this->d = $d;
$this->e = md5(rand(1111,9999));
}
public function __sleep()
{
return ['a','b','c','d'];
}
public function __wakeup()
{
$this->e = md5(rand(1111,9999));
}
}
$test = new Test(222, 3.456, 'TEST', [1,2,3]);
var_dump($test);
$str = serialize($test);
echo $str . PHP_EOL;
$obj = unserialize($str);
var_dump($obj);
- SPL
- Make sure you study:
*Iterator*
: just know what they areArrayIterator
andArrayObject
make sure you're up to speed on these!
- Just be aware of the "classic" data structure classes
- Make sure you study:
- Generators
- Late Static Binding
- Traits
Fetch Modes:
- Focus on array and object fetch modes
Questions are drawn from here:
- https://www.php.net/manual/en/security.php
Read up on the
crypt()
function - https://www.php.net/manual/en/function.crypt.php
Make sure you read up on
htmlspecialchars()
- https://www.php.net/htmlspecialchars
Do a quick read on the
crypt()
function password_hash()
leverages this- Might be on the test File upload documentation
- https://www.php.net/manual/en/features.file-upload.php
Example of aggregated Catch block:
try {
$pdo = new PDO($params);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException | Exception $e) {
error_log('Database error: ' . date('Y-m-d H:i:s'));
} catch (Throwable $e) {
error_log('Any and all errors or exceptions: ' . date('Y-m-d H:i:s'));
} finally {
echo 'Database connection ';
echo ($pdo) ? 'succeeded' : 'failed';
}
- http://localhost:9999/#/4/16
- Remove
similar_text()
- Remove
- http://localhost:9999/#/2/59
- s/be No space in "C" answer!
- http://localhost:9999/#/9/19
- s/be "All records in B that do not match records in A"
- http://localhost:9999/#/10/26
random_int()
takes 2 arguments!
- http://localhost:9999/#/10/57
- he "C" answer is not correct because there is no option
PASSWORD_BLOWFISH
- he "C" answer is not correct because there is no option
- http://localhost:9999/#/12/8
- The code doesn't show aggregate Catch blocks (see example above)
Question 3 is wrong. Number s/be "999.000.000,00"
- http://localhost:8888/show.php?f=02-58-84.php s/be a space!
- http://localhost:8888/show.php?f=02-58-84.php
- Need to add ' ' to output