diving into hhvm extensions (phpnw conference 2015)
TRANSCRIPT
![Page 1: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/1.jpg)
Diving intoHHVM Extensions
James TitcumbPHPNW Conference 2015
![Page 2: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/2.jpg)
James Titcumbwww.jamestitcumb.comwww.roave.comwww.phphants.co.ukwww.phpsouthcoast.co.uk@asgrim
Who is this guy?
![Page 3: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/3.jpg)
First, some background...
source: Microsoft
![Page 4: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/4.jpg)
![Page 5: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/5.jpg)
![Page 6: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/6.jpg)
![Page 7: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/7.jpg)
How PHP works
PHP code
OpCache
Execute (VM)
Lexer + Parser
Compiler
![Page 8: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/8.jpg)
How HHVM worksPHP code
OpCache
Execute (VM)
Lexer + Parser
Compiler
JIT
Execute (Native)
![Page 9: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/9.jpg)
Hack features
● Return/parameter type hints● ?nullable● Collections (Vectors, Sets, Maps, etc.)● Async functions● Enums● Generics● Lambda expressions ==>● XHP● more stuff
![Page 10: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/10.jpg)
The HHVM codebase
![Page 11: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/11.jpg)
The Engine
hphp/parser
![Page 12: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/12.jpg)
The Engine
hphp/parserhphp/compiler
![Page 13: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/13.jpg)
The Engine
hphp/parserhphp/compilerhphp/hhbbc
![Page 14: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/14.jpg)
The Engine
hphp/parserhphp/compilerhphp/hhbbchphp/hhvm
![Page 15: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/15.jpg)
The Engine
hphp/parserhphp/compilerhphp/hhbbchphp/hhvmhphp/runtime/vm
![Page 16: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/16.jpg)
The Engine
hphp/parserhphp/compilerhphp/hhbbchphp/hhvmhphp/runtime/vmhphp/runtime/vm/jit
![Page 17: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/17.jpg)
The Extensions
hphp/runtime/ext
![Page 18: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/18.jpg)
The Extensions
hphp/runtime/exthphp/system/php
![Page 19: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/19.jpg)
Compile HHVM?
![Page 20: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/20.jpg)
source: https://xkcd.com/303/
![Page 21: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/21.jpg)
My First HHVM Extension™
![Page 22: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/22.jpg)
config.cmake
HHVM_EXTENSION(calc ext_calc.cpp)
![Page 23: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/23.jpg)
ext_calc.cpp#include "hphp/runtime/ext/extension.h"
namespace HPHP {
static class CalcExtension : public Extension {
public:
CalcExtension(): Extension("calc") {}
virtual void moduleInit() {}
} s_calc_extension;
HHVM_GET_MODULE(calc);
} // namespace HPHP
![Page 24: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/24.jpg)
ext_calc.cpp#include "hphp/runtime/ext/extension.h"
namespace HPHP {
static class CalcExtension : public Extension {
public:
CalcExtension(): Extension("calc") {}
virtual void moduleInit() {}
} s_calc_extension;
HHVM_GET_MODULE(calc);
} // namespace HPHP
![Page 25: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/25.jpg)
ext_calc.cpp#include "hphp/runtime/ext/extension.h"
namespace HPHP {
static class CalcExtension : public Extension {
public:
CalcExtension(): Extension("calc") {}
virtual void moduleInit() {}
} s_calc_extension;
HHVM_GET_MODULE(calc);
} // namespace HPHP
![Page 26: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/26.jpg)
ext_calc.cpp#include "hphp/runtime/ext/extension.h"
namespace HPHP {
static class CalcExtension : public Extension {
public:
CalcExtension(): Extension("calc") {}
virtual void moduleInit() {}
} s_calc_extension;
HHVM_GET_MODULE(calc);
} // namespace HPHP
![Page 27: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/27.jpg)
ext_calc.cpp#include "hphp/runtime/ext/extension.h"
namespace HPHP {
static class CalcExtension : public Extension {
public:
CalcExtension(): Extension("calc") {}
virtual void moduleInit() {}
} s_calc_extension;
HHVM_GET_MODULE(calc);
} // namespace HPHP
![Page 28: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/28.jpg)
… that’s it.
<?php
var_dump(extension_loaded('calc'));
test.php
![Page 29: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/29.jpg)
Compile it.(waaaat?!)
![Page 30: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/30.jpg)
Compile & run the test#!/bin/bash
hphpize
cmake . && make
/usr/bin/hhvm \
-d extension_dir=. \
-d hhvm.extensions[]=calc.so \
test.php
![Page 31: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/31.jpg)
Compile & run the test$ ./build.sh
bool(true)
$
![Page 32: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/32.jpg)
Hack it!
![Page 33: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/33.jpg)
source: http://goo.gl/kUAxBI
![Page 34: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/34.jpg)
config.cmake
HHVM_EXTENSION(calc ext_calc.cpp)HHVM_SYSTEMLIB(calc ext_calc.php)
![Page 35: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/35.jpg)
ext_calc.cpp#include "hphp/runtime/ext/extension.h"
namespace HPHP {
static class CalcExtension : public Extension {
public:
CalcExtension(): Extension("calc") {}
virtual void moduleInit() {
loadSystemlib();
}
} s_calc_extension;
HHVM_GET_MODULE(calc);
} // namespace HPHP
![Page 36: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/36.jpg)
ext_calc.php<?hh
function calc_sub(int $a, int $b): int {
return $a - $b;
}
![Page 37: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/37.jpg)
… that’s it.
<?php
var_dump(extension_loaded('calc'));
var_dump(calc_sub(5, 3));
test.php
![Page 38: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/38.jpg)
Compile & run the test$ ./build.sh
bool(true)
int(2)
$
![Page 39: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/39.jpg)
Sprinkle some C++ infor good measure
![Page 40: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/40.jpg)
ext_calc.cpp// ... SNIP ...
virtual void moduleInit() {
HHVM_FE(calc_add);
loadSystemlib();
}
// ... SNIP ...
![Page 41: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/41.jpg)
ext_calc.cpp// ... SNIP ...
static int64_t HHVM_FUNCTION(calc_add, int64_t a, int64_t b) {
return a + b;
}
// ... SNIP ...
![Page 42: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/42.jpg)
in php extensions...PHP_FUNCTION(calc_add)
{
// ... SNIP ...
#ifndef FAST_ZPP
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &a, &b) == FAILURE) {
return;
}
#else
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_LONG(a)
Z_PARAM_LONG(b)
ZEND_PARSE_PARAMETERS_END();
#endif
// ... SNIP ...
![Page 43: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/43.jpg)
ext_calc.php<?hh
<<__Native>>
function calc_add(int $a, int $b): int;
function calc_sub(int $a, int $b): int {
return $a - $b;
}
![Page 44: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/44.jpg)
… that’s it.
<?php
var_dump(extension_loaded('calc'));
var_dump(calc_sub(5, 3));
var_dump(calc_add(5, 3));
test.php
![Page 45: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/45.jpg)
Compile & run the test$ ./build.sh
bool(true)
int(2)
int(8)
$
![Page 46: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/46.jpg)
Debugging?!
![Page 47: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/47.jpg)
source: http://www.gnu.org/software/gdb/
![Page 48: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/48.jpg)
Add debug mode#!/bin/bash
hphpize
cmake \
-DCMAKE_C_FLAGS="-O0 -ggdb3" \
-DCMAKE_CXX_FLAGS="-O0 -ggdb3" \
-DCMAKE_BUILD_TYPE=Debug \
.
make
# ... SNIP ...
![Page 49: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/49.jpg)
Run with gdb$ gdb --args \
/usr/bin/hhvm \
-d extension_dir=. \
-d hhvm.extensions[]=calc.so \
test.php
GNU gdb (Ubuntu 7.9-1ubuntu1) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.
org/licenses/gpl.html>
--- snip ---
Reading symbols from /usr/bin/hhvm...done.
(gdb)
![Page 50: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/50.jpg)
Breakpoints(gdb) b ext_calc.cpp:6
No source file named ext_calc.cpp.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (ext_calc.cpp:6) pending.
(gdb)
![Page 51: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/51.jpg)
Running(gdb) r
Starting program: /usr/bin/hhvm -d extension_dir=. -d hhvm.extensions\[\]
=calc.so smoke.php
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 2, HPHP::f_calc_add (a=5, b=3) at /home/james/workspace/hhvm-
calc/ext_calc.cpp:6
6 return a + b;
(gdb) p a
$1 = 5
(gdb) p b
$2 = 3
(gdb)
![Page 52: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/52.jpg)
Handy commands
c continue / step out
n step over
s step into
p x print the value of a variable (x)
set x = y set a variable (x) to value (y)
bt print backtrace
q quit :)
![Page 53: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/53.jpg)
When NOT to write extensions
![Page 54: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/54.jpg)
When to write extensions
![Page 55: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/55.jpg)
BUCKLE UP.
![Page 56: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/56.jpg)
source: https://goo.gl/x7Srhe
![Page 57: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/57.jpg)
Integrating OpenGLinto an HHVM extension
![Page 58: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/58.jpg)
Don’t try this in production!
![Page 59: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/59.jpg)
srsly.
![Page 60: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/60.jpg)
Extension
Browser
![Page 61: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/61.jpg)
What I did
![Page 62: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/62.jpg)
![Page 63: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/63.jpg)
huh?!
![Page 64: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/64.jpg)
Make it OOOOOOO
![Page 65: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/65.jpg)
ext_foo.php<?hh
<<__NativeData("Foo")>>
class Foo {
<<__Native>>
public function bar(): int;
}
![Page 66: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/66.jpg)
C++ object!==
PHP object
![Page 67: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/67.jpg)
source: http://goo.gl/HORwLQ
![Page 68: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/68.jpg)
HHVM Universe
<?php
$o = new Foo();$o->bar();
PHP Landclass Foo {public: Foo() {} ~Foo() {}
int value = 5;}
Planet C++
int64_t HHVM_METHOD(Foo,bar){ auto data = Native::data<Foo>(this_);
return data->value;}
Time Vortex!?!?!
C++ object !== PHP object
![Page 69: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/69.jpg)
HHVM Universe
<?php
$o = new Foo();$o->bar();
PHP Landclass Foo {public: Foo() {} ~Foo() {}
int value = 5;}
Planet C++
int64_t HHVM_METHOD(Foo,bar){ auto data = Native::data<Foo>(this_);
return data->value;}
Time Vortex!?!?!
C++ object !== PHP object
![Page 70: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/70.jpg)
HHVM Universe
<?php
$o = new Foo();$o->bar();
PHP Landclass Foo {public: Foo() {} ~Foo() {}
int value = 5;}
Planet C++
int64_t HHVM_METHOD(Foo,bar){ auto data = Native::data<Foo>(this_);
return data->value;}
Time Vortex!?!?!
C++ object !== PHP object
![Page 71: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/71.jpg)
HHVM Universe
<?php
$o = new Foo();$o->bar();
PHP Landclass Foo {public: Foo() {} ~Foo() {}
int value = 5;}
Planet C++
int64_t HHVM_METHOD(Foo,bar){ auto data = Native::data<Foo>(this_);
return data->value;}
Time Vortex!?!?!
C++ object !== PHP object
![Page 72: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/72.jpg)
this slide is intentionally left blank
![Page 73: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/73.jpg)
ext_foo.php<?hh
class Foo {
private int $value
public function bar(): int
{
return $this->value;
}
}
![Page 74: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/74.jpg)
Demo?
![Page 75: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/75.jpg)
![Page 76: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/76.jpg)
source: http://goo.gl/7gWfNz
![Page 77: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/77.jpg)
Resources
● OpenGL Tutorial○ http://www.opengl-tutorial.org/
● HHVM Example Extension○ https://github.com/hhvm/extension-example
● Sara Golemon - HHVM extension blog series○ http://blog.golemon.com/2015/01/hhvm-extension-writing-part-iii.html
● Derick Rethans’ extension API cookbook○ https://github.com/derickr/hhvm-hni-cookbook
● The official API documentation○ https://github.com/facebook/hhvm/wiki/Extension%20API
● Journey of a Thousand Bytecodes○ http://hhvm.com/blog/6323/the-journey-of-a-thousand-bytecodes
![Page 78: Diving into HHVM Extensions (PHPNW Conference 2015)](https://reader033.vdocuments.site/reader033/viewer/2022042723/58f1968f1a28abac6d8b4595/html5/thumbnails/78.jpg)
Any questions? :)
https://joind.in/15434James Titcumb @asgrim