<?php declare(strict_types=1);

interface Ifoo {}

abstract class Foo implements Ifoo {
	/**
	 * @param int $a
	 * @param float $b
	 * @param array $c
	 * @param callable $d
	 * @param string $e
	 * @return string
	 */
	abstract public function bar(int $a, float $b, array $c, callable $d, string $e): string;

	protected function doNothing(): void {}
}

class Test {
	public function __construct(public string $foo, public string $bar) {}
}

/**
 * Docblock comment
 */
class FooBar extends Foo implements Ifoo {
	public function bar(int $a, float $b, array $c, callable $d, string $e = 'default'): string
	{
		$cstr = print_r($c, TRUE);
		$d();

		return "{$a}, ${b}, " . $cstr;
	}

	private function operations(int $a, int $b): int
	{
		$this?->x?->bar();

		$this->doNothing();

		$c = $a + $b;
		$a = $c - $b;

		$c = $a * $b;
		$b = (int) ($c / $a);

		return $c;
	}
}

trait Baz {
	public function about(): array
	{
		return [
			'__CLASS__' => __CLASS__,
			'__DIR__' => __DIR__,
			'__FILE__' => __FILE__,
			'__FUNCTION__' => __FUNCTION__,
			'__LINE__' => __LINE__,
			'__METHOD__' => __METHOD__,
			'__NAMESPACE__' => __NAMESPACE__,
			'__TRAIT__' => __TRAIT__,
		];
	}
}

$square = fn (int $x) => $x ** 2;

foreach ([-1, 0, 1, 2] as $x)
{
	$not = match ($x) {
		0 => 1,
		1,-1 => 0,
		default => 0,
	};
}

/*
 * Multi-line comment
 */
$foobar = new FooBar();

$baz = ['a' => 'b'];

// C++ style comment
$x = 3;

# Perl-style comment
$y = [
	1,
	2,
	3
];

// Multi-line ternary statement
#{Attribute]
$q = ($x !== 2)
	? 'yes'
	: 'no';

/*
Heredoc
*/$z = $x + $y;
$sql = <<<SQL
	SELECT * FROM "foo" WHERE "bar"='baz' AND id={$x};
SQL;

/* Nowdoc */
$template = <<<'TEMPLATE'
	<foo>{x}</foo>
TEMPLATE;

?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>HTML</title>
</head>
<body>
<h1><?= $_SERVER['HTTP_HOST'] ?></h1>
</body>
</html>
<?php exit(); ?>