Php 7.3 fix (#5434)

* Inherit from message instead of implement

When regestering class (implmenets other class) during MINIT, zend_class_implements
would call zend_class_entry->interface_gets_implemented(). In PHP-7.3 interface_gets_implemented shares the same location with create_object.
However, during MINIT, the global object storeage hasn't been initialized. And thus, caused segment fault in php 7.3.

* Use zend_string_init where interned string may be the value.
zend_string_dup will keep using the existing interned string.
In php 7.3, interned string cannot be destroyed from user's code.

* Uncommment debug code

* Use latest phpunit for each php versions

* Revert change in Dockerfile

* Update php test to use the new docker image

* Update composer

* Change docker organization

* Update phpunit

* Debug phpunit

* Store phpunit into bin dir in docker image

* Install valgrind to docker

* Fix compatibility test

* Remove generated_service_test from compatibility c extension test

* Update 32bit php test to the new docker image

* Install bison

* Fix build.sh

* Fix DOCKERIMAGE_PREFIX

* Fix basename

* Add comment to build_and_run_docker2.sh

* Remove commented code

* Fix comments
diff --git a/php/tests/array_test.php b/php/tests/array_test.php
index 36a649e..b008433 100644
--- a/php/tests/array_test.php
+++ b/php/tests/array_test.php
@@ -7,7 +7,7 @@
 use Foo\TestMessage;
 use Foo\TestMessage\Sub;
 
-class RepeatedFieldTest extends PHPUnit_Framework_TestCase
+class RepeatedFieldTest extends \PHPUnit\Framework\TestCase
 {
 
     #########################################################
diff --git a/php/tests/compatibility_test.sh b/php/tests/compatibility_test.sh
index dc8de5d..f4af524 100755
--- a/php/tests/compatibility_test.sh
+++ b/php/tests/compatibility_test.sh
@@ -123,8 +123,12 @@
 sed -i.bak '/php_implementation_test.php/d' phpunit.xml
 sed -i.bak '/generated_phpdoc_test.php/d' phpunit.xml
 sed -i.bak 's/generated_phpdoc_test.php//g' tests/test.sh
+sed -i.bak 's/generated_service_test.php//g' tests/test.sh
 sed -i.bak '/memory_leak_test.php/d' tests/test.sh
 sed -i.bak '/^    public function testTimestamp()$/,/^    }$/d' tests/well_known_test.php
+sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/array_test.php
+sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/map_field_test.php
+sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/test_base.php
 for t in "${tests[@]}"
 do
   remove_error_test tests/$t
diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php
index 8168eeb..06f9a90 100644
--- a/php/tests/encode_decode_test.php
+++ b/php/tests/encode_decode_test.php
@@ -31,6 +31,7 @@
     {
         $m = new TestMessage();
         $m->mergeFromJsonString("{\"optionalInt32\":1}");
+        $this->assertEquals(1, $m->getOptionalInt32());
     }
 
     public function testDecodeTopLevelBoolValue()
@@ -276,6 +277,7 @@
         $to = new TestPackedMessage();
         $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
         TestUtil::assertTestPackedMessage($to);
+        $this->assertTrue(true);
     }
 
     public function testPackedDecodeUnpacked()
@@ -283,6 +285,7 @@
         $to = new TestPackedMessage();
         $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
         TestUtil::assertTestPackedMessage($to);
+        $this->assertTrue(true);
     }
 
     public function testUnpackedEncode()
@@ -298,6 +301,7 @@
         $to = new TestUnpackedMessage();
         $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
         TestUtil::assertTestPackedMessage($to);
+        $this->assertTrue(true);
     }
 
     public function testUnpackedDecodeUnpacked()
@@ -305,6 +309,7 @@
         $to = new TestUnpackedMessage();
         $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
         TestUtil::assertTestPackedMessage($to);
+        $this->assertTrue(true);
     }
 
     public function testDecodeInt64()
@@ -361,6 +366,7 @@
         $data = hex2bin('c80501');
         $m = new TestMessage();
         $m->mergeFromString($data);
+        $this->assertTrue(true);
     }
 
     public function testEncodeNegativeInt32()
diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php
index 96dad22..38c3809 100644
--- a/php/tests/generated_class_test.php
+++ b/php/tests/generated_class_test.php
@@ -260,12 +260,14 @@
     {
         $m = new TestMessage();
         $m->setOptionalNestedEnum(NestedEnum::ZERO);
+        $this->assertTrue(true);
     }
 
     public function testLegacyNestedEnum()
     {
         $m = new TestMessage();
         $m->setOptionalNestedEnum(\Foo\TestMessage_NestedEnum::ZERO);
+        $this->assertTrue(true);
     }
 
     public function testLegacyTypehintWithNestedEnums()
@@ -405,6 +407,7 @@
           $m = new TestMessage();
           $hex = hex2bin("ff");
           $m->setOptionalBytes($hex);
+          $this->assertTrue(true);
       }
 
     #########################################################
@@ -709,6 +712,8 @@
         // test nested messages
         $sub = new NoNamespaceMessage\NestedMessage();
         $n->setNestedMessage($sub);
+
+        $this->assertTrue(true);
     }
 
     public function testEnumWithoutNamespace()
@@ -718,6 +723,7 @@
         $repeatedNoNamespaceEnum = $m->getRepeatedNoNamespaceEnum();
         $repeatedNoNamespaceEnum[] = NoNameSpaceEnum::VALUE_A;
         $m->setRepeatedNoNamespaceEnum($repeatedNoNamespaceEnum);
+        $this->assertTrue(true);
     }
 
     #########################################################
@@ -1262,6 +1268,8 @@
         $m = \Upper_enum_value\NotAllowed::NULL;
         $m = \Upper_enum_value\NotAllowed::VOID;
         $m = \Upper_enum_value\NotAllowed::ITERABLE;
+
+        $this->assertTrue(true);
     }
 
     #########################################################
@@ -1297,6 +1305,7 @@
     {
         $m = new testLowerCaseMessage();
         $n = testLowerCaseEnum::VALUE;
+        $this->assertTrue(true);
     }
 
     #########################################################
@@ -1363,6 +1372,7 @@
         ]);
 
         TestUtil::assertTestMessage($m);
+        $this->assertTrue(true);
     }
 
     #########################################################
diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php
index 447bdd9..0260879 100644
--- a/php/tests/map_field_test.php
+++ b/php/tests/map_field_test.php
@@ -7,7 +7,7 @@
 use Foo\TestMessage;
 use Foo\TestMessage\Sub;
 
-class MapFieldTest extends PHPUnit_Framework_TestCase {
+class MapFieldTest extends \PHPUnit\Framework\TestCase {
 
     #########################################################
     # Test int32 field.
diff --git a/php/tests/test_base.php b/php/tests/test_base.php
index 80f603c..27efc87 100644
--- a/php/tests/test_base.php
+++ b/php/tests/test_base.php
@@ -4,7 +4,7 @@
 use Foo\TestEnum;
 use Foo\TestMessage\Sub;
 
-class TestBase extends PHPUnit_Framework_TestCase
+class TestBase extends \PHPUnit\Framework\TestCase
 {
 
     public function setFields(TestMessage $m)
@@ -338,5 +338,6 @@
   // This test is to avoid the warning of no test by php unit.
   public function testNone()
   {
+      $this->assertTrue(true);
   }
 }
diff --git a/php/tests/well_known_test.php b/php/tests/well_known_test.php
index db5d5a7..a16e070 100644
--- a/php/tests/well_known_test.php
+++ b/php/tests/well_known_test.php
@@ -48,6 +48,7 @@
     public function testImportDescriptorProto()
     {
         $msg = new TestImportDescriptorProto();
+        $this->assertTrue(true);
     }
 
     public function testAny()